diff --git a/.auditignore b/.auditignore new file mode 100644 index 0000000..bed492d --- /dev/null +++ b/.auditignore @@ -0,0 +1,3 @@ +https://npmjs.com/advisories/12 +https://npmjs.com/advisories/577 +https://npmjs.com/advisories/663 \ No newline at end of file diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..04e96b5 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,20 @@ +root = true + +[*] +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +indent_style = space +indent_size = 4 + +[*.{ts}] +indent_style = space +indent_size = 4 + +[*.{js,json}] +indent_style = space +indent_size = 2 + +[{.codeclimate.yml,.eslintignore,.eslintrc,.istanbul.yml,.publishrc,.travis.yml}] +indent_style = space +indent_size = 2 diff --git a/.gitignore b/.gitignore index ad46b30..35b39cc 100644 --- a/.gitignore +++ b/.gitignore @@ -23,6 +23,9 @@ coverage # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) .grunt +# IntelliJ IDEA +.idea + # Bower dependency directory (https://bower.io/) bower_components @@ -59,3 +62,11 @@ typings/ # next.js build output .next + +# project specific output +dist +dist-test +dist-test-createjs +lib +lib-test +lib-test-createjs diff --git a/.istanbul.yml b/.istanbul.yml new file mode 100644 index 0000000..1ba315e --- /dev/null +++ b/.istanbul.yml @@ -0,0 +1,46 @@ +verbose: false +instrumentation: + root: lib + extensions: + - .ts +# default-excludes: true +# excludes: [] +# variable: __coverage__ +# compact: true +# preserve-comments: false +# complete-copy: false +# save-baseline: false +# baseline-file: ./coverage/coverage-baseline.raw.json +# include-all-sources: false +# include-pid: false +# es-modules: true +# auto-wrap: true +# reporting: +# print: summary +# reports: +# - lcov +# dir: ./coverage +# summarizer: pkg +# report-config: {} +# watermarks: +# statements: [50, 80] +# functions: [50, 80] +# branches: [50, 80] +# lines: [50, 80] +# hooks: +# hook-run-in-context: false +# post-require-hook: null +# handle-sigint: false +# check: +# global: +# statements: 0 +# lines: 0 +# branches: 0 +# functions: 0 +# excludes: [] +# each: +# statements: 0 +# lines: 0 +# branches: 0 +# functions: 0 +# excludes: [] diff --git a/.npmignore b/.npmignore new file mode 100644 index 0000000..7d26c39 --- /dev/null +++ b/.npmignore @@ -0,0 +1,40 @@ +/.idea +/.nyc_output +/.vscode +/coverage +/dist +/dist-test +/dist-test-createjs +/docs +/lib-test +/lib-test-createjs +/node-modules +/not-ported-extensions +/src +/static +/test +/transpiled-code +/typings +CODE_OF_CONDUCT.md +CONTRIBUTING.md +ISSUE_TEMPLATE.md +PULL_REQUEST_TEMPLATE.md +karma.createjs.conf.js +tsconfig.example.json +tsconfig.json +tsconfig.test.json +tsconfig.createjs.test.json +tslint.example.json +tslint.json +tslint.test.json +webpack.config.js +webpack.example.config.js +yarn.lock +.auditignore +.editorconfig +.gitignore +.istanbul.yml +.npmignore +.prettierrc +.publishrc +.travis.yml diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..da47411 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,9 @@ +{ + "printWidth": 140, + "tabWidth": 4, + "useTabs": false, + "semi": true, + "singleQuote": false, + "trailingComma": "none", + "bracketSpacing": true +} diff --git a/.publishrc b/.publishrc new file mode 100644 index 0000000..ed9936c --- /dev/null +++ b/.publishrc @@ -0,0 +1,14 @@ +{ + "validations": { + "vulnerableDependencies": true, + "uncommittedChanges": true, + "untrackedFiles": true, + "sensitiveData": true, + "branch": "master", + "gitTag": true + }, + "confirm": true, + "publishTag": "latest --access public", + "prePublishScript": false, + "postPublishScript": false +} \ No newline at end of file diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..6475485 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,21 @@ +language: node_js +node_js: + - stable +env: + - CODECLIMATE_REPO_TOKEN=684e974d5f69f76db7350eb1cb8cb7b575ffcaecfed16c2df8b86f92ab4bc189 + - CODECLIMATE_API_HOST=https://codebeat.co/webhooks/code_coverage CODECLIMATE_REPO_TOKEN=357054ed-343d-462a-af39-69d5b685236f +before_install: + - export CHROME_BIN=chromium-browser + - export DISPLAY=:99.0 + - sh -e /etc/init.d/xvfb start + - yarn config set registry "https://registry.npmjs.org" + - yarn global add greenkeeper-lockfile@1 + - yarn global add codeclimate-test-reporter +before_script: + - greenkeeper-lockfile-update +script: + - yarn test +after_script: + - greenkeeper-lockfile-upload +after_success: + - codeclimate-test-reporter < coverage/lcov.info diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..1c7e639 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,5 @@ +// Place your settings in this file to overwrite default and user settings. +{ + "typescript.tsdk": "node_modules/typescript/lib", + "tslint.configFile": "tslint.test.json" +} diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..4f859aa --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,27 @@ +# RobotlegsJS DisplayList Mediator Changelog: + +## Robotlegs-DisplayListMediator 1.0.0 + +### v1.0.0 - Planned stable version + +- [ ] Add instructions of how to install the **@robotlegsjs/displaylistmediator** package into **README.md**. + +- [ ] Use [**Function Types**](https://www.typescriptlang.org/docs/handbook/functions.html) for handlers and callbacks instead of generic **Function** type. + +- [ ] Evaluate if **IMediator** interface should be mandatory. + +- [x] Update **Prettier** rules: + + - [x] **printWidth** should be around **140** characters per line. + +- [ ] Improve Code Coverage to reach 100%. + +- [ ] Migrate [original documentation](https://github.com/robotlegs/robotlegs-framework/blob/master/src/readme.md) and adapt it to TypeScript. + +## Robotlegs-DisplayListMediator 0.0.1 + +### v0.0.1 + +- Implement integration with generic display list (see #1). + +- Update dev dependencies to latest version. diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..6ed419b --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,46 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +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. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a professional setting + +## Our Responsibilities + +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. + +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. + +## Scope + +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. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at contact@robotlegsjs.io. 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. + +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. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] + +[homepage]: http://contributor-covenant.org +[version]: http://contributor-covenant.org/version/1/4/ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..e8ece75 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,46 @@ +# Contributing to RobotlegsJS-DisplayListMediator + +## Setup + +1 - Clone your fork of the repository: +``` +$ git clone https://github.com/YOUR_USERNAME/RobotlegsJS-DisplayListMediator.git +``` + +2 - Install npm dependencies using yarn: +``` +$ yarn install +``` + +3 - Run start process +``` +$ yarn start +``` + +4 - Run test process +``` +$ yarn test +``` + +## Guidelines + +- Please try to [combine multiple commits before +pushing](http://stackoverflow.com/questions/6934752/combining-multiple-commits-before-pushing-in-git). + +- Please use `TDD` when fixing bugs. This means that you should write a unit +test that fails because it reproduces the issue, then fix the issue and finally run +the test to ensure that the issue has been resolved. This helps us to prevent +fixed bugs from happening again in the future. + +- Always format your code using `yarn run autoformat`. + +- Please keep the test coverage at 100%. Write additional unit test if +necessary. + +- Please create an issue before sending a PR if your commit is going to change the +public interface of the package or it includes significant architecture +changes. + +- Feel free to ask for help from other members of the RobotlegsJS team via the +[gitter chat](https://gitter.im/RobotlegsJS/RobotlegsJS) or +[github issues](https://github.com/RobotlegsJS/RobotlegsJS-DisplayListMediator/issues). \ No newline at end of file diff --git a/ISSUE_TEMPLATE.md b/ISSUE_TEMPLATE.md new file mode 100644 index 0000000..60ae8df --- /dev/null +++ b/ISSUE_TEMPLATE.md @@ -0,0 +1,35 @@ + + +## Expected Behavior + + + +## Current Behavior + + + +## Possible Solution + + + +## Steps to Reproduce (for bugs) + + +1. +2. +3. +4. + +## Context + + + +## Your Environment + +* Version used: +* Environment name and version (e.g. Chrome 39, node.js 5.4): +* Operating System and version (desktop or mobile): +* Link to your project: + +# Stack trace + diff --git a/LICENSE b/LICENSE index ae96c71..892294f 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2018 RobotlegsJS +Copyright (c) 2017-present, RobotlegsJS Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/PULL_REQUEST_TEMPLATE.md b/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..f084d5a --- /dev/null +++ b/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,43 @@ + + +## Description + + + +## Related Issue + + + + + + +## Motivation and Context + + + +## How Has This Been Tested? + + + + + +## Types of changes + + + +- [ ] Updated docs / Refactor code / Added a tests case (non-breaking change) +- [ ] Bug fix (non-breaking change which fixes an issue) +- [ ] New feature (non-breaking change which adds functionality) +- [ ] Breaking change (fix or feature that would cause existing functionality to change) + +## Checklist: + + + + +- [ ] My code follows the code style of this project. +- [ ] My change requires a change to the documentation. +- [ ] I have updated the documentation accordingly. +- [ ] I have read the **CONTRIBUTING** document. +- [ ] I have added tests to cover my changes. +- [ ] All new and existing tests passed. diff --git a/README.md b/README.md index d36f399..f95930a 100644 --- a/README.md +++ b/README.md @@ -1 +1,40 @@ -# RobotlegsJS-DisplayListMediator \ No newline at end of file +RobotlegsJS DisplayList Mediator +=== + +[![GitHub license](https://img.shields.io/badge/license-MIT-green.svg)](https://github.com/RobotlegsJS/RobotlegsJS-DisplayListMediator/blob/master/LICENSE) +[![Gitter chat](https://badges.gitter.im/RobotlegsJS/RobotlegsJS.svg)](https://gitter.im/RobotlegsJS/RobotlegsJS) +[![Build Status](https://travis-ci.org/RobotlegsJS/RobotlegsJS-DisplayListMediator.svg?branch=master)](https://travis-ci.org/RobotlegsJS/RobotlegsJS-DisplayListMediator) +[![codebeat badge](https://codebeat.co/badges/357054ed-343d-462a-af39-69d5b685236f)](https://codebeat.co/projects/github-com-robotlegsjs-robotlegsjs-displaylistmediator-master) +[![Test Coverage](https://api.codeclimate.com/v1/badges/5a703aad95acd4b412a4/test_coverage)](https://codeclimate.com/github/RobotlegsJS/RobotlegsJS-DisplayListMediator/test_coverage) +[![npm version](https://badge.fury.io/js/%40robotlegsjs%2Fdisplaylistmediator.svg)](https://badge.fury.io/js/%40robotlegsjs%2Fdisplaylistmediator) +[![Greenkeeper badge](https://badges.greenkeeper.io/RobotlegsJS/RobotlegsJS-DisplayListMediator.svg)](https://greenkeeper.io/) +[![styled with prettier](https://img.shields.io/badge/styled_with-prettier-ff69b4.svg)](https://github.com/prettier/prettier) + +Installation +--- + +You can get the latest release and the type definitions using [NPM](https://www.npmjs.com/): + +```bash +npm install @robotlegsjs/displaylistmediator --save +``` + +Or using [Yarn](https://yarnpkg.com/en/): + +```bash +yarn add @robotlegsjs/displaylistmediator +``` + +**Dependencies** + ++ [RobotlegsJS](https://github.com/RobotlegsJS/RobotlegsJS) ++ [tslib](https://github.com/Microsoft/tslib) + +**Peer Dependencies** + ++ [reflect-metadata](https://github.com/rbuckton/reflect-metadata) + +License +--- + +[MIT](LICENSE) diff --git a/karma.createjs.conf.js b/karma.createjs.conf.js new file mode 100644 index 0000000..c05ecca --- /dev/null +++ b/karma.createjs.conf.js @@ -0,0 +1,77 @@ +process.env.TEST = true; +process.env.NODE_ENV = "test"; + +const webpackConfig = require("./webpack.config.js")({ production: false, karma: true, library: "createjs" }); + +delete webpackConfig.entry; + +module.exports = config => { + + var configuration = { + basePath: "", + frameworks: [ + "mocha", + "chai", + "sinon", + "es6-shim" + ], + files: [ + { pattern: "node_modules/reflect-metadata/Reflect.js", include: true }, + { pattern: "node_modules/bluebird/js/browser/bluebird.js", include: true }, + { pattern: "node_modules/easeljs/lib/easeljs.js", include: true }, + { pattern: "./test/createjs/**/**/*.test.ts", include: true }, + { pattern: '**/*.map', served: true, included: false, watched: true } + ], + preprocessors: { + "./**/**/**/**.ts": ["sourcemap"], + "./test/**/**/**.test.ts": ["webpack"] + }, + webpack: webpackConfig, + webpackMiddleware: { + noInfo: true + }, + plugins: [ + "karma-webpack", + "karma-sourcemap-writer", + "karma-sourcemap-loader", + "karma-remap-istanbul", + "karma-mocha-reporter", + "karma-mocha", + "karma-chai", + "karma-sinon", + "karma-es6-shim", + "karma-coverage-istanbul-reporter" + ], + reporters: ( + config.singleRun ? + ["dots", "mocha", "coverage-istanbul"] : + ["dots", "mocha"] + ), + coverageIstanbulReporter: { + reports: ["html", "lcov", "lcovonly", "text-summary"], + dir: "coverage", + fixWebpackSourcePaths: true, + "report-config": { + html: { + subdir: "html-report" + } + } + }, + port: 9876, + colors: true, + logLevel: config.LOG_INFO, + autoWatch: true, + browsers: [], + browserNoActivityTimeout: 50000 + }; + + if (process.env.TRAVIS) { + configuration.browsers.push("PhantomJS"); + configuration.plugins.push("karma-phantomjs-launcher"); + } else { + configuration.browsers.push("PhantomJS"); + configuration.plugins.push("karma-phantomjs-launcher"); + } + + config.set(configuration); +}; diff --git a/package.json b/package.json new file mode 100644 index 0000000..7a896e2 --- /dev/null +++ b/package.json @@ -0,0 +1,111 @@ +{ + "name": "@robotlegsjs/displaylistmediator", + "version": "0.0.1", + "description": "Generic DisplayList View integration with RobotlegsJS", + "main": "lib/index.js", + "typings": "lib/index.d.ts", + "scripts": { + "test": "npm run test:createjs", + "test:createjs": "node --max-old-space-size=2048 node_modules/.bin/karma start karma.createjs.conf.js --single-run", + "mocha": "mocha test/**/*.test.ts --require ts-node/register", + "autoformat": "prettier --config .prettierrc --write {src,test}/**/*.ts", + "tslint-check:src": "tslint-config-prettier-check ./tslint.json", + "tslint-check:test": "tslint-config-prettier-check ./tslint.test.json", + "tslint:src": "tslint --project tsconfig.json", + "tslint:test": "tslint --config tslint.test.json --project tsconfig.test.json", + "tslint": "npm run tslint-check:src && npm run tslint-check:test && npm run tslint:src && npm run tslint:test", + "clean-up": "rimraf .nyc_output && rimraf coverage && rimraf lib && rimraf lib-test && rimraf dist && rimraf dist-test", + "compile:src": "tsc -d --importHelpers", + "compile:test": "npm run compile:test:createjs", + "compile:test:createjs": "tsc -p tsconfig.createjs.test.json -d --importHelpers", + "dev": "webpack", + "build": "webpack --env.production", + "prepare": "npm run clean-up && npm run compile:src", + "prepublishOnly": "publish-please guard", + "publish-please": "npm run tslint && npm run autoformat && npm run clean-up && npm run test && publish-please" + }, + "repository": { + "type": "git", + "url": "git@github.com:RobotlegsJS/RobotlegsJS-DisplayListMediator.git" + }, + "publishConfig": { + "registry": "https://registry.npmjs.org" + }, + "keywords": [ + "TypeScript", + "Robotlegs", + "IoC", + "DisplayList", + "Mediator" + ], + "author": "RobotlegsJS", + "contributors": [ + "Tiago Schenkel " + ], + "license": "MIT", + "bugs": { + "url": "https://github.com/RobotlegsJS/RobotlegsJS-DisplayListMediator/issues" + }, + "homepage": "https://github.com/RobotlegsJS/RobotlegsJS-DisplayListMediator#readme", + "dependencies": { + "@robotlegsjs/core": "^0.2.1", + "tslib": "^1.9.3" + }, + "peerDependencies": { + "reflect-metadata": "^0.1.12" + }, + "devDependencies": { + "@types/bluebird": "^3.5.24", + "@types/chai": "^4.1.6", + "@types/core-js": "^2.5.0", + "@types/easeljs": "^1.0.0", + "@types/mocha": "^5.2.5", + "@types/sinon": "^5.0.5", + "bluebird": "^3.5.2", + "browserify-versionify": "^1.0.6", + "chai": "^4.2.0", + "easeljs": "^1.0.2", + "es6-map": "^0.1.5", + "es6-symbol": "^3.1.1", + "glslify": "^6.3.1", + "html-webpack-plugin": "^3.2.0", + "imports-loader": "^0.8.0", + "istanbul": "^0.4.5", + "istanbul-instrumenter-loader": "^3.0.1", + "karma": "^3.0.0", + "karma-chai": "^0.1.0", + "karma-chrome-launcher": "^2.2.0", + "karma-coverage-istanbul-reporter": "^2.0.4", + "karma-es6-shim": "^1.0.0", + "karma-mocha": "^1.3.0", + "karma-mocha-reporter": "^2.2.5", + "karma-phantomjs-launcher": "^1.0.4", + "karma-remap-istanbul": "^0.6.0", + "karma-sinon": "^1.0.5", + "karma-sinon-chai": "^2.0.2", + "karma-sourcemap-loader": "^0.3.7", + "karma-sourcemap-writer": "^0.1.2", + "karma-webpack": "^3.0.5", + "mocha": "^5.2.0", + "open-browser-webpack-plugin": "^0.0.5", + "prettier": "^1.14.3", + "publish-please": "^4.0.1", + "reflect-metadata": "^0.1.12", + "remap-istanbul": "^0.12.0", + "rimraf": "^2.6.2", + "sinon": "^5.1.1", + "sinon-chai": "^3.2.0", + "ts-loader": "^5.2.1", + "ts-node": "^7.0.1", + "tslint": "^5.11.0", + "tslint-config-prettier": "^1.15.0", + "typescript": "^3.1.2", + "uglifyjs-webpack-plugin": "^2.0.1", + "webpack": "^4.20.2", + "webpack-cli": "^3.1.2", + "webpack-concat-plugin": "^3.0.0", + "webpack-dev-server": "^3.1.9", + "webpack-merge": "^4.1.4", + "webpack-simple-progress-plugin": "^0.0.4" + } +} diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..8590db7 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,52 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +// DisplayList +export { IDisplayObject } from "./robotlegs/bender/displayList/api/IDisplayObject"; +export { IDisplayObjectContainer } from "./robotlegs/bender/displayList/api/IDisplayObjectContainer"; +export { IDisplayObjectObserver } from "./robotlegs/bender/displayList/api/IDisplayObjectObserver"; +export { IDisplayObjectObserverFactory } from "./robotlegs/bender/displayList/api/IDisplayObjectObserverFactory"; + +// ContextView +export { IContextView } from "./robotlegs/bender/extensions/contextView/api/IContextView"; +export { ContextView } from "./robotlegs/bender/extensions/contextView/impl/ContextView"; +export { ContextViewListenerConfig } from "./robotlegs/bender/extensions/contextView/impl/ContextViewListenerConfig"; +export { ContextViewExtension } from "./robotlegs/bender/extensions/contextView/ContextViewExtension"; + +// MediatorMap +export { IMediator } from "./robotlegs/bender/extensions/mediatorMap/api/IMediator"; +export { IMediatorMap } from "./robotlegs/bender/extensions/mediatorMap/api/IMediatorMap"; +export { IMediatorMapping } from "./robotlegs/bender/extensions/mediatorMap/api/IMediatorMapping"; +export { IMediatorConfigurator } from "./robotlegs/bender/extensions/mediatorMap/dsl/IMediatorConfigurator"; +export { IMediatorMapper } from "./robotlegs/bender/extensions/mediatorMap/dsl/IMediatorMapper"; +export { IMediatorUnmapper } from "./robotlegs/bender/extensions/mediatorMap/dsl/IMediatorUnmapper"; +export { MediatorFactory } from "./robotlegs/bender/extensions/mediatorMap/impl/MediatorFactory"; +export { MediatorManager } from "./robotlegs/bender/extensions/mediatorMap/impl/MediatorManager"; +export { MediatorMap } from "./robotlegs/bender/extensions/mediatorMap/impl/MediatorMap"; +export { MediatorMapper } from "./robotlegs/bender/extensions/mediatorMap/impl/MediatorMapper"; +export { MediatorMapping } from "./robotlegs/bender/extensions/mediatorMap/impl/MediatorMapping"; +export { MediatorViewHandler } from "./robotlegs/bender/extensions/mediatorMap/impl/MediatorViewHandler"; +export { NullMediatorUnmapper } from "./robotlegs/bender/extensions/mediatorMap/impl/NullMediatorUnmapper"; +export { MediatorMapExtension } from "./robotlegs/bender/extensions/mediatorMap/MediatorMapExtension"; + +// ViewManager +export { IViewHandler } from "./robotlegs/bender/extensions/viewManager/api/IViewHandler"; +export { IViewManager } from "./robotlegs/bender/extensions/viewManager/api/IViewManager"; +export { ConfigureViewEvent } from "./robotlegs/bender/extensions/viewManager/impl/ConfigureViewEvent"; +export { ContainerBinding } from "./robotlegs/bender/extensions/viewManager/impl/ContainerBinding"; +export { ContainerBindingEvent } from "./robotlegs/bender/extensions/viewManager/impl/ContainerBindingEvent"; +export { ContainerRegistry } from "./robotlegs/bender/extensions/viewManager/impl/ContainerRegistry"; +export { ContainerRegistryEvent } from "./robotlegs/bender/extensions/viewManager/impl/ContainerRegistryEvent"; +export { ManualStageObserver } from "./robotlegs/bender/extensions/viewManager/impl/ManualStageObserver"; +export { StageCrawler } from "./robotlegs/bender/extensions/viewManager/impl/StageCrawler"; +export { StageObserver } from "./robotlegs/bender/extensions/viewManager/impl/StageObserver"; +export { ViewManager } from "./robotlegs/bender/extensions/viewManager/impl/ViewManager"; +export { ViewManagerEvent } from "./robotlegs/bender/extensions/viewManager/impl/ViewManagerEvent"; +export { ManualStageObserverExtension } from "./robotlegs/bender/extensions/viewManager/ManualStageObserverExtension"; +export { StageCrawlerExtension } from "./robotlegs/bender/extensions/viewManager/StageCrawlerExtension"; +export { StageObserverExtension } from "./robotlegs/bender/extensions/viewManager/StageObserverExtension"; +export { ViewManagerExtension } from "./robotlegs/bender/extensions/viewManager/ViewManagerExtension"; diff --git a/src/robotlegs/bender/displayList/api/IDisplayObject.ts b/src/robotlegs/bender/displayList/api/IDisplayObject.ts new file mode 100644 index 0000000..83febbf --- /dev/null +++ b/src/robotlegs/bender/displayList/api/IDisplayObject.ts @@ -0,0 +1,13 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import { IDisplayObjectContainer } from "./IDisplayObjectContainer"; + +export const IDisplayObject = Symbol("IDisplayObject"); +export interface IDisplayObject { + parent: IDisplayObjectContainer; +} diff --git a/src/robotlegs/bender/displayList/api/IDisplayObjectContainer.ts b/src/robotlegs/bender/displayList/api/IDisplayObjectContainer.ts new file mode 100644 index 0000000..c81e63b --- /dev/null +++ b/src/robotlegs/bender/displayList/api/IDisplayObjectContainer.ts @@ -0,0 +1,18 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import { IDisplayObject } from "./IDisplayObject"; + +export const IDisplayObjectContainer = Symbol("IDisplayObjectContainer"); +export interface IDisplayObjectContainer extends IDisplayObject { + children?: IDisplayObject[]; + + numChildren?: number; + getChildAt?(index: number): IDisplayObject; + + contains(child: IDisplayObject): boolean; +} diff --git a/src/robotlegs/bender/displayList/api/IDisplayObjectObserver.ts b/src/robotlegs/bender/displayList/api/IDisplayObjectObserver.ts new file mode 100644 index 0000000..cefae61 --- /dev/null +++ b/src/robotlegs/bender/displayList/api/IDisplayObjectObserver.ts @@ -0,0 +1,23 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import { IDisplayObject } from "./IDisplayObject"; + +/** + * + */ +export interface IDisplayObjectObserver { + displayObject: IDisplayObject; + + addAddedToStageHandler(handler: Function): void; + + addRemovedFromStageHandler(handler: Function): void; + + addConfigureViewHandler(handler: Function): void; + + destroy(): void; +} diff --git a/src/robotlegs/bender/displayList/api/IDisplayObjectObserverFactory.ts b/src/robotlegs/bender/displayList/api/IDisplayObjectObserverFactory.ts new file mode 100644 index 0000000..103cfc2 --- /dev/null +++ b/src/robotlegs/bender/displayList/api/IDisplayObjectObserverFactory.ts @@ -0,0 +1,15 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import { IDisplayObject } from "./IDisplayObject"; +import { IDisplayObjectObserver } from "./IDisplayObjectObserver"; + +/** + * + */ +export const IDisplayObjectObserverFactory = Symbol("IDisplayObjectObserverFactory"); +export type IDisplayObjectObserverFactory = (view: IDisplayObject, useCapture: boolean) => IDisplayObjectObserver; diff --git a/src/robotlegs/bender/extensions/contextView/ContextViewExtension.ts b/src/robotlegs/bender/extensions/contextView/ContextViewExtension.ts new file mode 100644 index 0000000..e0d3126 --- /dev/null +++ b/src/robotlegs/bender/extensions/contextView/ContextViewExtension.ts @@ -0,0 +1,61 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import { instanceOfType, IContext, IExtension, IInjector, ILogger } from "@robotlegsjs/core"; + +import { IContextView } from "./api/IContextView"; +import { ContextView } from "./impl/ContextView"; + +/** + *

This Extension waits for a ContextView to be added as a configuration + * and maps it into the context's injector.

+ * + *

It should be installed before context initialization.

+ */ +export class ContextViewExtension implements IExtension { + /*============================================================================*/ + /* Private Properties */ + /*============================================================================*/ + + private _injector: IInjector; + + private _logger: ILogger; + + /*============================================================================*/ + /* Public Functions */ + /*============================================================================*/ + + /** + * @inheritDoc + */ + public extend(context: IContext): void { + this._injector = context.injector; + this._logger = context.getLogger(this); + context.beforeInitializing(this.beforeInitializing.bind(this)); + context.addConfigHandler(instanceOfType(ContextView), this.handleContextView.bind(this)); + } + + /*============================================================================*/ + /* Private Functions */ + /*============================================================================*/ + + private handleContextView(contextView: IContextView): void { + if (this._injector.isBound(IContextView)) { + this._logger.warn("A contextView has already been installed, ignoring {0}", [contextView.view]); + } else { + this._logger.debug("Mapping {0} as contextView", [contextView.view]); + + this._injector.bind(IContextView).toConstantValue(contextView); + } + } + + private beforeInitializing(): void { + if (!this._injector.isBound(IContextView)) { + this._logger.error("A ContextView must be installed if you install the ContextViewExtension."); + } + } +} diff --git a/src/robotlegs/bender/extensions/contextView/api/IContextView.ts b/src/robotlegs/bender/extensions/contextView/api/IContextView.ts new file mode 100644 index 0000000..eae0124 --- /dev/null +++ b/src/robotlegs/bender/extensions/contextView/api/IContextView.ts @@ -0,0 +1,13 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import { IDisplayObjectContainer } from "../../../displayList/api/IDisplayObjectContainer"; + +export const IContextView = Symbol("IContextView"); +export interface IContextView { + view: IDisplayObjectContainer; +} diff --git a/src/robotlegs/bender/extensions/contextView/impl/ContextView.ts b/src/robotlegs/bender/extensions/contextView/impl/ContextView.ts new file mode 100644 index 0000000..a480476 --- /dev/null +++ b/src/robotlegs/bender/extensions/contextView/impl/ContextView.ts @@ -0,0 +1,51 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import { IConfig } from "@robotlegsjs/core"; + +import { IDisplayObjectContainer } from "../../../displayList/api/IDisplayObjectContainer"; + +import { IContextView } from "../api/IContextView"; + +/** + * The Context View represents the root Container for a Context + */ +export class ContextView implements IContextView, IConfig { + private _view: IDisplayObjectContainer; + + /*============================================================================*/ + /* Constructor */ + /*============================================================================*/ + + /** + * The Context View represents the root Container for a Context + * @param view The root Container for this Context + */ + constructor(view: IDisplayObjectContainer) { + if (view !== null && view !== undefined) { + this._view = view; + } else { + throw new Error("View can't be null or undefined"); + } + } + + /*============================================================================*/ + /* Public Properties */ + /*============================================================================*/ + + /** + * + */ + public configure(): void {} + + /** + * The root Container for this Context + */ + public get view(): IDisplayObjectContainer { + return this._view; + } +} diff --git a/src/robotlegs/bender/extensions/contextView/impl/ContextViewListenerConfig.ts b/src/robotlegs/bender/extensions/contextView/impl/ContextViewListenerConfig.ts new file mode 100644 index 0000000..1e9baa5 --- /dev/null +++ b/src/robotlegs/bender/extensions/contextView/impl/ContextViewListenerConfig.ts @@ -0,0 +1,45 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import { injectable, inject, IConfig } from "@robotlegsjs/core"; + +import { IContextView } from "../api/IContextView"; +import { IViewManager } from "../../viewManager/api/IViewManager"; + +/** + * This configuration file adds the ContextView to the viewManager. + * + * It requires that the ViewManagerExtension, ContextViewExtension + * and a ContextView have been installed. + */ +@injectable() +export class ContextViewListenerConfig implements IConfig { + /*============================================================================*/ + /* Public Properties */ + /*============================================================================*/ + + private _contextView: IContextView; + + private _viewManager: IViewManager; + + /*============================================================================*/ + /* Public Functions */ + /*============================================================================*/ + + constructor(@inject(IContextView) contextView: IContextView, @inject(IViewManager) viewManager: IViewManager) { + this._contextView = contextView; + this._viewManager = viewManager; + } + + /** + * @inheritDoc + */ + public configure(): void { + // Adds the Context View to the View Manager at startup + this._viewManager.addContainer(this._contextView.view); + } +} diff --git a/src/robotlegs/bender/extensions/mediatorMap/MediatorMapExtension.ts b/src/robotlegs/bender/extensions/mediatorMap/MediatorMapExtension.ts new file mode 100644 index 0000000..72ede51 --- /dev/null +++ b/src/robotlegs/bender/extensions/mediatorMap/MediatorMapExtension.ts @@ -0,0 +1,75 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import { IContext, IExtension, IInjector } from "@robotlegsjs/core"; + +import { IMediatorMap } from "./api/IMediatorMap"; +import { MediatorMap } from "./impl/MediatorMap"; + +import { IViewManager } from "../viewManager/api/IViewManager"; + +/** + * This extension installs a shared IMediatorMap into the context + */ +export class MediatorMapExtension implements IExtension { + /*============================================================================*/ + /* Private Properties */ + /*============================================================================*/ + + private _injector: IInjector; + + private _mediatorMap: MediatorMap; + + private _viewManager: IViewManager; + + /*============================================================================*/ + /* Public Functions */ + /*============================================================================*/ + + /** + * @inheritDoc + */ + public extend(context: IContext): void { + context + .beforeInitializing(this.beforeInitializing.bind(this)) + .beforeDestroying(this.beforeDestroying.bind(this)) + .whenDestroying(this.whenDestroying.bind(this)); + this._injector = context.injector; + this._injector + .bind(IMediatorMap) + .to(MediatorMap) + .inSingletonScope(); + } + + /*============================================================================*/ + /* Private Functions */ + /*============================================================================*/ + + private beforeInitializing(): void { + this._mediatorMap = this._injector.get(IMediatorMap); + + if (this._injector.isBound(IViewManager)) { + this._viewManager = this._injector.get(IViewManager); + this._viewManager.addViewHandler(this._mediatorMap); + } + } + + private beforeDestroying(): void { + this._mediatorMap.unmediateAll(); + + if (this._injector.isBound(IViewManager)) { + this._viewManager = this._injector.get(IViewManager); + this._viewManager.removeViewHandler(this._mediatorMap); + } + } + + private whenDestroying(): void { + if (this._injector.isBound(IMediatorMap)) { + this._injector.unbind(IMediatorMap); + } + } +} diff --git a/src/robotlegs/bender/extensions/mediatorMap/api/IMediator.ts b/src/robotlegs/bender/extensions/mediatorMap/api/IMediator.ts new file mode 100644 index 0000000..2d9ce35 --- /dev/null +++ b/src/robotlegs/bender/extensions/mediatorMap/api/IMediator.ts @@ -0,0 +1,23 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +/** + * Optional Mediator interface + */ +export interface IMediator { + /** + * Initializes the mediator. This is run automatically by the mediatorMap when a mediator is created. + * Normally the initialize function is where you would add handlers using the eventMap. + */ + initialize(): void; + + /** + * Destroys the mediator. This is run automatically by the mediatorMap when a mediator is destroyed. + * You should clean up any handlers that were added directly (eventMap handlers will be cleaned up automatically). + */ + destroy(): void; +} diff --git a/src/robotlegs/bender/extensions/mediatorMap/api/IMediatorMap.ts b/src/robotlegs/bender/extensions/mediatorMap/api/IMediatorMap.ts new file mode 100644 index 0000000..0fa38c9 --- /dev/null +++ b/src/robotlegs/bender/extensions/mediatorMap/api/IMediatorMap.ts @@ -0,0 +1,65 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import { IClass, ITypeMatcher } from "@robotlegsjs/core"; + +import { IMediatorMapper } from "../dsl/IMediatorMapper"; +import { IMediatorUnmapper } from "../dsl/IMediatorUnmapper"; + +/** + * The Mediator Map allows you to bind Mediators to objects + */ +export const IMediatorMap = Symbol("IMediatorMap"); +export interface IMediatorMap { + /** + * Maps a matcher that will be tested against incoming items to be handled. + * @param matcher The type or package matcher specifying the rules for matching. + * @return the mapper so that you can continue the mapping. + */ + mapMatcher(matcher: ITypeMatcher): IMediatorMapper; + + /** + * Maps a type that will be tested against incoming items to be handled. + * Under the hood this will create a TypeMatcher for this type. + * @param type The class or interface to be matched against. + * @return the mapper so that you can continue the mapping. + */ + map(type: IClass): IMediatorMapper; + + /** + * Removes a mapping that was made against a matcher. + * No error will be thrown if there isn't a mapping to remove. + * @param matcher The type or package matcher specifying the rules for matching. + * @return the unmapper so that you can continue the unmapping. + */ + unmapMatcher(matcher: ITypeMatcher): IMediatorUnmapper; + + /** + * Removes a mapping that was made against a type. + * No error will be thrown if there isn't a mapping to remove. + * @param type The class or interface to be matched against. + * @return the unmapper so that you can continue the unmapping. + */ + unmap(type: IClass): IMediatorUnmapper; + + /** + * Mediates an item directly. If the item matches any mapped matchers or types then it will be mediated according to those mappings. + * @param item The item to create mediators for. + */ + mediate(item: any): void; + + /** + * Removes the mediators for an item if there are any. + * @param item The item to remove mediators for. + */ + unmediate(item: any): void; + + /** + * Removes all mediators + */ + unmediateAll(): void; +} diff --git a/src/robotlegs/bender/extensions/mediatorMap/api/IMediatorMapping.ts b/src/robotlegs/bender/extensions/mediatorMap/api/IMediatorMapping.ts new file mode 100644 index 0000000..c657fd8 --- /dev/null +++ b/src/robotlegs/bender/extensions/mediatorMap/api/IMediatorMapping.ts @@ -0,0 +1,38 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import { IClass, ITypeFilter } from "@robotlegsjs/core"; + +/** + * Represents a Mediator mapping + */ +export interface IMediatorMapping { + /** + * The matcher for this mapping + */ + matcher: ITypeFilter; + + /** + * The concrete mediator class + */ + mediatorClass: IClass; + + /** + * A list of guards to check before allowing mediator creation + */ + guards: any[]; + + /** + * A list of hooks to run before creating a mediator + */ + hooks: any[]; + + /** + * Should the mediator be removed when the mediated item looses scope? + */ + autoRemoveEnabled: boolean; +} diff --git a/src/robotlegs/bender/extensions/mediatorMap/dsl/IMediatorConfigurator.ts b/src/robotlegs/bender/extensions/mediatorMap/dsl/IMediatorConfigurator.ts new file mode 100644 index 0000000..1060f9d --- /dev/null +++ b/src/robotlegs/bender/extensions/mediatorMap/dsl/IMediatorConfigurator.ts @@ -0,0 +1,36 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +/** + * Configures a mediator mapping + */ +export interface IMediatorConfigurator { + /** + * Guards to check before allowing a mediator to be created + * @param guards Guards + * @return Self + */ + withGuards(...guards: any[]): IMediatorConfigurator; + + /** + * Hooks to run before a mediator is created + * @param hooks Hooks + * @return Self + */ + withHooks(...hooks: any[]): IMediatorConfigurator; + + /** + * Should the mediator be removed when the mediated item looses scope? + * + *

Usually this would be when the mediated item is a Display Object + * and it leaves the stage.

+ * + * @param value Boolean + * @return Self + */ + autoRemove(value: boolean): IMediatorConfigurator; +} diff --git a/src/robotlegs/bender/extensions/mediatorMap/dsl/IMediatorMapper.ts b/src/robotlegs/bender/extensions/mediatorMap/dsl/IMediatorMapper.ts new file mode 100644 index 0000000..61d3405 --- /dev/null +++ b/src/robotlegs/bender/extensions/mediatorMap/dsl/IMediatorMapper.ts @@ -0,0 +1,22 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import { IClass } from "@robotlegsjs/core"; + +import { IMediatorConfigurator } from "./IMediatorConfigurator"; + +/** + * Maps a matcher to a concrete Mediator class + */ +export interface IMediatorMapper { + /** + * Maps a matcher to a concrete Mediator class + * @param mediatorClass The concrete mediator class + * @return Mapping configurator + */ + toMediator(mediatorClass: IClass): IMediatorConfigurator; +} diff --git a/src/robotlegs/bender/extensions/mediatorMap/dsl/IMediatorUnmapper.ts b/src/robotlegs/bender/extensions/mediatorMap/dsl/IMediatorUnmapper.ts new file mode 100644 index 0000000..c9e5f8c --- /dev/null +++ b/src/robotlegs/bender/extensions/mediatorMap/dsl/IMediatorUnmapper.ts @@ -0,0 +1,24 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import { IClass } from "@robotlegsjs/core"; + +/** + * Unmaps a Mediator + */ +export interface IMediatorUnmapper { + /** + * Unmaps a mediator from this matcher + * @param mediatorClass Mediator to unmap + */ + fromMediator(mediatorClass: IClass): void; + + /** + * Unmaps all mediator mappings for this matcher + */ + fromAll(): void; +} diff --git a/src/robotlegs/bender/extensions/mediatorMap/impl/Mediator.ts b/src/robotlegs/bender/extensions/mediatorMap/impl/Mediator.ts new file mode 100644 index 0000000..f8264b2 --- /dev/null +++ b/src/robotlegs/bender/extensions/mediatorMap/impl/Mediator.ts @@ -0,0 +1,129 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import { injectable, inject, IClass, IEvent, IEventMap, IEventDispatcher, Event } from "@robotlegsjs/core"; + +import { IMediator } from "../api/IMediator"; + +/** + * Classic Robotlegs mediator implementation + * + *

Override initialize and destroy to hook into the mediator lifecycle.

+ */ +@injectable() +export abstract class Mediator implements IMediator { + /*============================================================================*/ + /* Protected Properties */ + /*============================================================================*/ + + @inject(IEventMap) + protected eventMap: IEventMap; + + @inject(IEventDispatcher) + protected eventDispatcher: IEventDispatcher; + + protected _viewComponent: T; + + /*============================================================================*/ + /* Public Properties */ + /*============================================================================*/ + + public set view(view: T) { + this._viewComponent = view; + } + + public get view(): T { + return this._viewComponent; + } + + /*============================================================================*/ + /* Public Functions */ + /*============================================================================*/ + + /** + * @inheritDoc + */ + public abstract initialize(): void; + + /** + * @inheritDoc + */ + public abstract destroy(): void; + + /** + * Runs after the mediator has been destroyed. + * Cleans up listeners mapped through the local EventMap. + */ + public postDestroy(): void { + this.eventMap.unmapAllListeners(); + } + + /*============================================================================*/ + /* Protected Functions */ + /*============================================================================*/ + + protected addViewListener( + eventString: string, + listener: Function, + thisObject?: any, + eventClass?: IClass, + useCapture?: boolean, + priority?: number + ): void { + this.eventMap.mapListener(this._viewComponent, eventString, listener, thisObject, eventClass, useCapture, priority); + } + + protected addContextListener( + eventString: string, + listener: Function, + thisObject?: any, + eventClass?: IClass, + useCapture?: boolean, + priority?: number + ): void { + this.eventMap.mapListener(this.eventDispatcher, eventString, listener, thisObject, eventClass, useCapture, priority); + } + + protected addDomListener( + eventTarget: EventTarget, + eventString: string, + listener: EventListenerOrEventListenerObject, + options?: boolean | AddEventListenerOptions + ): void { + this.eventMap.mapDomListener(eventTarget, eventString, listener, options); + } + + protected removeViewListener( + eventString: string, + listener: Function, + thisObject?: any, + eventClass?: IClass, + useCapture?: boolean + ): void { + this.eventMap.unmapListener(this._viewComponent, eventString, listener, thisObject, eventClass, useCapture); + } + + protected removeContextListener( + eventString: string, + listener: Function, + thisObject?: any, + eventClass?: IClass, + useCapture?: boolean + ): void { + this.eventMap.unmapListener(this.eventDispatcher, eventString, listener, thisObject, eventClass, useCapture); + } + + protected removeDomListener(eventTarget: EventTarget, eventString: string, listener: EventListenerOrEventListenerObject): void { + this.eventMap.unmapDomListener(eventTarget, eventString, listener); + } + + protected dispatch(event: Event): void { + if (this.eventDispatcher.hasEventListener(event.type)) { + this.eventDispatcher.dispatchEvent(event); + } + } +} diff --git a/src/robotlegs/bender/extensions/mediatorMap/impl/MediatorFactory.ts b/src/robotlegs/bender/extensions/mediatorMap/impl/MediatorFactory.ts new file mode 100755 index 0000000..e201d53 --- /dev/null +++ b/src/robotlegs/bender/extensions/mediatorMap/impl/MediatorFactory.ts @@ -0,0 +1,152 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import { IClass, IType, IInjector, applyHooks, guardsApprove, instantiateUnmapped, ITypeFilter } from "@robotlegsjs/core"; + +import { IDisplayObjectObserverFactory } from "../../../displayList/api/IDisplayObjectObserverFactory"; + +import { IMediatorMapping } from "../api/IMediatorMapping"; + +import { MediatorManager } from "./MediatorManager"; + +/** + * @private + */ +export class MediatorFactory { + /*============================================================================*/ + /* Private Properties */ + /*============================================================================*/ + + private _mediators: Map = new Map(); + + private _injector: IInjector; + + private _manager: MediatorManager; + + /*============================================================================*/ + /* Constructor */ + /*============================================================================*/ + + /** + * @private + */ + constructor(injector: IInjector, manager?: MediatorManager) { + this._injector = injector; + this._manager = manager || new MediatorManager(this, this._injector.get(IDisplayObjectObserverFactory)); + } + + /*============================================================================*/ + /* Public Functions */ + /*============================================================================*/ + + /** + * @private + */ + public getMediator(item: any, mapping: IMediatorMapping): any { + return this._mediators.get(item) ? this._mediators.get(item).get(mapping) : null; + } + + /** + * @private + */ + public createMediators(item: any, type: IClass, mappings: any[]): any[] { + let createdMediators: any[] = []; + let mediator: any; + mappings.forEach((mapping: IMediatorMapping) => { + mediator = this.getMediator(item, mapping); + + if (!mediator) { + this.mapTypeForFilterBinding(mapping.matcher, type, item); + mediator = this.createMediator(item, mapping); + this.unmapTypeForFilterBinding(mapping.matcher, type, item); + } + + if (mediator) { + createdMediators.push(mediator); + } + }); + return createdMediators; + } + + /** + * @private + */ + public removeMediators(item: any): void { + let mediators: Map = this._mediators.get(item); + if (!mediators) { + return; + } + + mediators.forEach((value, key) => this._manager.removeMediator(value, item, key)); + + this._mediators.delete(item); + } + + /** + * @private + */ + public removeAllMediators(): void { + this._mediators.forEach((value, key) => this.removeMediators(key)); + } + + /*============================================================================*/ + /* Private Functions */ + /*============================================================================*/ + + private createMediator(item: any, mapping: IMediatorMapping): any { + let mediator: any = this.getMediator(item, mapping); + + if (mediator) { + return mediator; + } + + if (mapping.guards.length === 0 || guardsApprove(mapping.guards, this._injector)) { + let mediatorClass: IClass = mapping.mediatorClass; + mediator = instantiateUnmapped(this._injector, mediatorClass); + if (mapping.hooks.length > 0) { + this._injector.bind(mediatorClass).toConstantValue(mediator); + applyHooks(mapping.hooks, this._injector); + this._injector.unbind(mediatorClass); + } + this.addMediator(mediator, item, mapping); + } + return mediator; + } + + private addMediator(mediator: any, item: any, mapping: IMediatorMapping): void { + let mediatorMap = this._mediators.get(item) || new Map(); + this._mediators.set(item, mediatorMap); + mediatorMap.set(mapping, mediator); + this._manager.addMediator(mediator, item, mapping); + } + + private mapTypeForFilterBinding(filter: ITypeFilter, type: IClass, item: any): void { + let requiredTypes = this.requiredTypesFor(filter, type); + requiredTypes.forEach((requiredType: IType) => { + this._injector.bind(requiredType).toConstantValue(item); + }); + } + + private unmapTypeForFilterBinding(filter: ITypeFilter, type: IClass, item: any): void { + let requiredTypes = this.requiredTypesFor(filter, type); + requiredTypes.forEach((requiredType: IType) => { + if (this._injector.isBound(requiredType)) { + this._injector.unbind(requiredType); + } + }); + } + + private requiredTypesFor(filter: ITypeFilter, type: IClass): Array> { + let requiredTypes: Array> = filter.allOfTypes.concat(filter.anyOfTypes); + + if (requiredTypes.indexOf(type) === -1) { + requiredTypes.push(type); + } + + return requiredTypes; + } +} diff --git a/src/robotlegs/bender/extensions/mediatorMap/impl/MediatorManager.ts b/src/robotlegs/bender/extensions/mediatorMap/impl/MediatorManager.ts new file mode 100644 index 0000000..70f0394 --- /dev/null +++ b/src/robotlegs/bender/extensions/mediatorMap/impl/MediatorManager.ts @@ -0,0 +1,124 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import { IDisplayObject } from "../../../displayList/api/IDisplayObject"; +import { IDisplayObjectObserver } from "../../../displayList/api/IDisplayObjectObserver"; +import { IDisplayObjectObserverFactory } from "../../../displayList/api/IDisplayObjectObserverFactory"; + +import { IMediatorMapping } from "../api/IMediatorMapping"; +import { MediatorFactory } from "./MediatorFactory"; + +/** + * @private + */ +export class MediatorManager { + /*============================================================================*/ + /* Private Properties */ + /*============================================================================*/ + + private _mediatorFactory: MediatorFactory; + private _displayObjectObserverFactory: IDisplayObjectObserverFactory; + + private _observers: Map = new Map(); + + /*============================================================================*/ + /* Constructor */ + /*============================================================================*/ + + /** + * @private + */ + constructor(factory: MediatorFactory, displayObjectObserverFactory: IDisplayObjectObserverFactory) { + this._mediatorFactory = factory; + this._displayObjectObserverFactory = displayObjectObserverFactory; + } + + /*============================================================================*/ + /* Public Functions */ + /*============================================================================*/ + + /** + * @private + */ + public addMediator(mediator: any, item: any, mapping: IMediatorMapping): void { + const displayObject: IDisplayObject = item; + + // Watch Display Object for removal + if (displayObject !== undefined && mapping.autoRemoveEnabled) { + if (!this._observers.has(displayObject)) { + let observer: IDisplayObjectObserver = this._displayObjectObserverFactory(displayObject, false); + observer.addRemovedFromStageHandler(this.onRemovedFromStage); + this._observers.set(displayObject, observer); + } + } + + // Synchronize with item life-cycle + this.initializeMediator(mediator, item); + } + + /** + * @private + */ + public removeMediator(mediator: any, item: any, mapping: IMediatorMapping): void { + const displayObject: IDisplayObject = item; + + // Watch Display Object for removal + if (displayObject !== undefined && mapping.autoRemoveEnabled) { + if (this._observers.has(displayObject)) { + let observer = this._observers.get(displayObject); + observer.destroy(); + this._observers.delete(displayObject); + } + } + + this.destroyMediator(mediator); + } + + /*============================================================================*/ + /* Private Functions */ + /*============================================================================*/ + + private onRemovedFromStage = (view: IDisplayObject): void => { + this._mediatorFactory.removeMediators(view); + }; + + private initializeMediator(mediator: any, mediatedItem: any): void { + if ("preInitialize" in mediator) { + mediator.preInitialize(); + } + + if ("view" in mediator) { + mediator.view = mediatedItem; + } + + if ("initialize" in mediator) { + mediator.initialize(); + } + + if ("postInitialize" in mediator) { + mediator.postInitialize(); + } + } + + private destroyMediator(mediator: any): void { + if ("preDestroy" in mediator) { + mediator.preDestroy(); + } + + if ("destroy" in mediator) { + mediator.destroy(); + } + + if ("view" in mediator) { + mediator.view = null; + } + + if ("postDestroy" in mediator) { + mediator.postDestroy(); + } + } +} diff --git a/src/robotlegs/bender/extensions/mediatorMap/impl/MediatorMap.ts b/src/robotlegs/bender/extensions/mediatorMap/impl/MediatorMap.ts new file mode 100755 index 0000000..6a76913 --- /dev/null +++ b/src/robotlegs/bender/extensions/mediatorMap/impl/MediatorMap.ts @@ -0,0 +1,131 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import { injectable, inject, IClass, IContext, ILogger, ITypeMatcher, TypeMatcher } from "@robotlegsjs/core"; + +import { IDisplayObject } from "../../../displayList/api/IDisplayObject"; + +import { IViewHandler } from "../../viewManager/api/IViewHandler"; + +import { IMediatorMap } from "../api/IMediatorMap"; +import { IMediatorMapper } from "../dsl/IMediatorMapper"; +import { IMediatorUnmapper } from "../dsl/IMediatorUnmapper"; + +import { MediatorFactory } from "./MediatorFactory"; +import { MediatorViewHandler } from "./MediatorViewHandler"; +import { NullMediatorUnmapper } from "./NullMediatorUnmapper"; +import { MediatorMapper } from "./MediatorMapper"; + +/** + * @private + */ +@injectable() +export class MediatorMap implements IMediatorMap, IViewHandler { + /*============================================================================*/ + /* Private Properties */ + /*============================================================================*/ + + private _mappers: Map = new Map(); + + private _logger: ILogger; + + private _factory: MediatorFactory; + + private _viewHandler: MediatorViewHandler; + + private NULL_UNMAPPER: IMediatorUnmapper = new NullMediatorUnmapper(); + + /*============================================================================*/ + /* Constructor */ + /*============================================================================*/ + + /** + * @private + */ + constructor(@inject(IContext) context: IContext) { + this._logger = context.getLogger(this); + this._factory = new MediatorFactory(context.injector); + this._viewHandler = new MediatorViewHandler(this._factory); + } + + /*============================================================================*/ + /* Public Functions */ + /*============================================================================*/ + + /** + * @inheritDoc + */ + public mapMatcher(matcher: ITypeMatcher): IMediatorMapper { + const desc = matcher.createTypeFilter().descriptor; + let mapper = this._mappers.get(desc); + + if (mapper) { + return mapper; + } + + mapper = this.createMapper(matcher); + this._mappers.set(desc, mapper); + return mapper; + } + + /** + * @inheritDoc + */ + public map(type: IClass): IMediatorMapper { + return this.mapMatcher(new TypeMatcher().allOf(type)); + } + + /** + * @inheritDoc + */ + public unmapMatcher(matcher: ITypeMatcher): IMediatorUnmapper { + return this._mappers.get(matcher.createTypeFilter().descriptor) || this.NULL_UNMAPPER; + } + + /** + * @inheritDoc + */ + public unmap(type: IClass): IMediatorUnmapper { + return this.unmapMatcher(new TypeMatcher().allOf(type)); + } + + /** + * @inheritDoc + */ + public handleView(view: IDisplayObject, type: IClass): void { + this._viewHandler.handleView(view, type); + } + + /** + * @inheritDoc + */ + public mediate(item: any): void { + this._viewHandler.handleItem(item, >item.constructor); + } + + /** + * @inheritDoc + */ + public unmediate(item: any): void { + this._factory.removeMediators(item); + } + + /** + * @inheritDoc + */ + public unmediateAll(): void { + this._factory.removeAllMediators(); + } + + /*============================================================================*/ + /* Private Functions */ + /*============================================================================*/ + + private createMapper(matcher: ITypeMatcher): MediatorMapper { + return new MediatorMapper(matcher.createTypeFilter(), this._viewHandler, this._logger); + } +} diff --git a/src/robotlegs/bender/extensions/mediatorMap/impl/MediatorMapper.ts b/src/robotlegs/bender/extensions/mediatorMap/impl/MediatorMapper.ts new file mode 100755 index 0000000..ef65f22 --- /dev/null +++ b/src/robotlegs/bender/extensions/mediatorMap/impl/MediatorMapper.ts @@ -0,0 +1,114 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import { IClass, ILogger, ITypeFilter } from "@robotlegsjs/core"; + +import { IMediatorMapping } from "../api/IMediatorMapping"; +import { IMediatorConfigurator } from "../dsl/IMediatorConfigurator"; +import { IMediatorMapper } from "../dsl/IMediatorMapper"; +import { IMediatorUnmapper } from "../dsl/IMediatorUnmapper"; + +import { MediatorViewHandler } from "./MediatorViewHandler"; +import { MediatorMapping } from "./MediatorMapping"; + +/** + * @private + */ +export class MediatorMapper implements IMediatorMapper, IMediatorUnmapper { + /*============================================================================*/ + /* Private Properties */ + /*============================================================================*/ + + private _mappings: Map, IMediatorMapping> = new Map, IMediatorMapping>(); + + private _typeFilter: ITypeFilter; + + private _handler: MediatorViewHandler; + + private _logger: ILogger; + + /*============================================================================*/ + /* Constructor */ + /*============================================================================*/ + + /** + * @private + */ + constructor(typeFilter: ITypeFilter, handler: MediatorViewHandler, logger?: ILogger) { + this._typeFilter = typeFilter; + this._handler = handler; + this._logger = logger; + } + + /*============================================================================*/ + /* Public Functions */ + /*============================================================================*/ + + /** + * @inheritDoc + */ + public toMediator(mediatorClass: IClass): IMediatorConfigurator { + const mapping: IMediatorMapping = this._mappings.get(mediatorClass); + return mapping ? this.overwriteMapping(mapping) : this.createMapping(mediatorClass); + } + + /** + * @inheritDoc + */ + public fromMediator(mediatorClass: IClass): void { + const mapping: IMediatorMapping = this._mappings.get(mediatorClass); + + if (mapping) { + this.deleteMapping(mapping); + } + } + + /** + * @inheritDoc + */ + public fromAll(): void { + this._mappings.forEach(this.deleteMapping, this); + } + + /*============================================================================*/ + /* Private Functions */ + /*============================================================================*/ + + private createMapping(mediatorClass: IClass): MediatorMapping { + let mapping: MediatorMapping = new MediatorMapping(this._typeFilter, mediatorClass); + this._handler.addMapping(mapping); + this._mappings.set(mediatorClass, mapping); + + if (this._logger) { + this._logger.debug("{0} mapped to {1}", [this._typeFilter, mapping]); + } + + return mapping; + } + + private deleteMapping(mapping: IMediatorMapping): void { + this._handler.removeMapping(mapping); + this._mappings.delete(mapping.mediatorClass); + + if (this._logger) { + this._logger.debug("{0} unmapped from {1}", [this._typeFilter, mapping]); + } + } + + private overwriteMapping(mapping: IMediatorMapping): IMediatorConfigurator { + if (this._logger) { + this._logger.warn( + "{0} already mapped to {1}\n" + + 'If you have overridden this mapping intentionally you can use "unmap()" ' + + "prior to your replacement mapping in order to avoid seeing this message.\n", + [this._typeFilter, mapping] + ); + } + this.deleteMapping(mapping); + return this.createMapping(mapping.mediatorClass); + } +} diff --git a/src/robotlegs/bender/extensions/mediatorMap/impl/MediatorMapping.ts b/src/robotlegs/bender/extensions/mediatorMap/impl/MediatorMapping.ts new file mode 100644 index 0000000..40d2d7e --- /dev/null +++ b/src/robotlegs/bender/extensions/mediatorMap/impl/MediatorMapping.ts @@ -0,0 +1,105 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import { IClass, ITypeFilter } from "@robotlegsjs/core"; + +import { IMediatorMapping } from "../api/IMediatorMapping"; +import { IMediatorConfigurator } from "../dsl/IMediatorConfigurator"; + +/** + * @private + */ +export class MediatorMapping implements IMediatorMapping, IMediatorConfigurator { + /*============================================================================*/ + /* Public Properties */ + /*============================================================================*/ + + private _matcher: ITypeFilter; + + /** + * @inheritDoc + */ + public get matcher(): ITypeFilter { + return this._matcher; + } + + private _mediatorClass: IClass; + + /** + * @inheritDoc + */ + public get mediatorClass(): IClass { + return this._mediatorClass; + } + + private _guards: any[] = []; + + /** + * @inheritDoc + */ + public get guards(): any[] { + return this._guards; + } + + private _hooks: any[] = []; + + /** + * @inheritDoc + */ + public get hooks(): any[] { + return this._hooks; + } + + private _autoRemoveEnabled: boolean = true; + + /** + * @inheritDoc + */ + public get autoRemoveEnabled(): boolean { + return this._autoRemoveEnabled; + } + + /*============================================================================*/ + /* Constructor */ + /*============================================================================*/ + + /** + * @private + */ + constructor(matcher: ITypeFilter, mediatorClass: IClass) { + this._matcher = matcher; + this._mediatorClass = mediatorClass; + } + + /*============================================================================*/ + /* Public Functions */ + /*============================================================================*/ + + /** + * @inheritDoc + */ + public withGuards(...guards: any[]): IMediatorConfigurator { + this._guards = this._guards.concat.apply(this._guards, guards); + return this; + } + + /** + * @inheritDoc + */ + public withHooks(...hooks: any[]): IMediatorConfigurator { + this._hooks = this._hooks.concat.apply(this._hooks, hooks); + return this; + } + + /** + * @inheritDoc + */ + public autoRemove(value: boolean = true): IMediatorConfigurator { + this._autoRemoveEnabled = value; + return this; + } +} diff --git a/src/robotlegs/bender/extensions/mediatorMap/impl/MediatorViewHandler.ts b/src/robotlegs/bender/extensions/mediatorMap/impl/MediatorViewHandler.ts new file mode 100755 index 0000000..b603759 --- /dev/null +++ b/src/robotlegs/bender/extensions/mediatorMap/impl/MediatorViewHandler.ts @@ -0,0 +1,121 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import { IClass } from "@robotlegsjs/core"; + +import { IDisplayObject } from "../../../displayList/api/IDisplayObject"; + +import { IMediatorMapping } from "../api/IMediatorMapping"; +import { IViewHandler } from "../../viewManager/api/IViewHandler"; + +import { MediatorFactory } from "./MediatorFactory"; + +/** + * @private + */ +export class MediatorViewHandler implements IViewHandler { + /*============================================================================*/ + /* Private Properties */ + /*============================================================================*/ + + private _mappings: IMediatorMapping[] = []; + + private _knownMappings: Map, IMediatorMapping[] | boolean> = new Map, IMediatorMapping[]>(); + + private _factory: MediatorFactory; + + /*============================================================================*/ + /* Constructor */ + /*============================================================================*/ + + /** + * @private + */ + constructor(factory: MediatorFactory) { + this._factory = factory; + } + + /*============================================================================*/ + /* Public Functions */ + /*============================================================================*/ + + /** + * @private + */ + public addMapping(mapping: IMediatorMapping): void { + let index: number = this._mappings.indexOf(mapping); + if (index > -1) { + return; + } + this._mappings.push(mapping); + this._knownMappings.clear(); + } + + /** + * @private + */ + public removeMapping(mapping: IMediatorMapping): void { + let index: number = this._mappings.indexOf(mapping); + if (index === -1) { + return; + } + this._mappings.splice(index, 1); + this._knownMappings.clear(); + } + + /** + * @private + */ + public handleView(view: IDisplayObject, type: IClass): void { + let interestedMappings = this.getInterestedMappingsFor(view, type); + if (interestedMappings) { + this._factory.createMediators(view, type, interestedMappings); + } + } + + /** + * @private + */ + public handleItem(item: any, type: IClass): void { + let interestedMappings = this.getInterestedMappingsFor(item, type); + if (interestedMappings) { + this._factory.createMediators(item, type, interestedMappings); + } + } + + /*============================================================================*/ + /* Private Functions */ + /*============================================================================*/ + + private getInterestedMappingsFor(item: any, type: IClass): IMediatorMapping[] { + // we've seen this type before and nobody was interested + if (this._knownMappings.get(type) === false) { + return null; + } + + // we haven't seen this type before + if (this._knownMappings.get(type) === undefined) { + this._knownMappings.set(type, false); + + this._mappings.forEach((mapping: IMediatorMapping) => { + if (mapping.matcher.matches(item)) { + if (!this._knownMappings.get(type)) { + this._knownMappings.set(type, []); + } + (this._knownMappings.get(type) as IMediatorMapping[]).push(mapping); + } + }); + // nobody cares, let's get out of here + if (this._knownMappings.get(type) === false) { + return null; + } + } + + // these mappings really do care + return this._knownMappings.get(type) as IMediatorMapping[]; + } +} diff --git a/src/robotlegs/bender/extensions/mediatorMap/impl/NullMediatorUnmapper.ts b/src/robotlegs/bender/extensions/mediatorMap/impl/NullMediatorUnmapper.ts new file mode 100644 index 0000000..cf30219 --- /dev/null +++ b/src/robotlegs/bender/extensions/mediatorMap/impl/NullMediatorUnmapper.ts @@ -0,0 +1,29 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import { IClass } from "@robotlegsjs/core"; + +import { IMediatorUnmapper } from "../dsl/IMediatorUnmapper"; + +/** + * @private + */ +export class NullMediatorUnmapper implements IMediatorUnmapper { + /*============================================================================*/ + /* Public Functions */ + /*============================================================================*/ + + /** + * @private + */ + public fromMediator(mediatorClass: IClass): void {} + + /** + * @private + */ + public fromAll(): void {} +} diff --git a/src/robotlegs/bender/extensions/viewManager/ManualStageObserverExtension.ts b/src/robotlegs/bender/extensions/viewManager/ManualStageObserverExtension.ts new file mode 100644 index 0000000..1a9d24b --- /dev/null +++ b/src/robotlegs/bender/extensions/viewManager/ManualStageObserverExtension.ts @@ -0,0 +1,72 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import { IContext, IExtension, IInjector, ILogger } from "@robotlegsjs/core"; + +import { ContainerRegistry } from "./impl/ContainerRegistry"; +import { ManualStageObserver } from "./impl/ManualStageObserver"; +import { IDisplayObjectObserverFactory } from "../../displayList/api/IDisplayObjectObserverFactory"; + +let installCount: number = 0; + +/** + * This extension install a manual Stage Observer + */ +export class ManualStageObserverExtension implements IExtension { + /*============================================================================*/ + /* Private Static Properties */ + /*============================================================================*/ + + // Really? Yes, there can be only one. + private static _manualStageObserver: ManualStageObserver; + + /*============================================================================*/ + /* Private Properties */ + /*============================================================================*/ + + private _injector: IInjector; + + private _logger: ILogger; + + /*============================================================================*/ + /* Public Functions */ + /*============================================================================*/ + + /** + * @inheritDoc + */ + public extend(context: IContext): void { + context.whenInitializing(this.whenInitializing.bind(this)); + context.whenDestroying(this.whenDestroying.bind(this)); + installCount++; + this._injector = context.injector; + this._logger = context.getLogger(this); + } + + /*============================================================================*/ + /* Private Functions */ + /*============================================================================*/ + + private whenInitializing(): void { + // Hark, an actual Singleton! + if (!ManualStageObserverExtension._manualStageObserver) { + let containerRegistry: ContainerRegistry = this._injector.get(ContainerRegistry); + let factory: IDisplayObjectObserverFactory = this._injector.get(IDisplayObjectObserverFactory); + this._logger.debug("Creating genuine ManualStageObserver Singleton"); + ManualStageObserverExtension._manualStageObserver = new ManualStageObserver(containerRegistry, factory); + } + } + + private whenDestroying(): void { + installCount--; + if (installCount === 0) { + this._logger.debug("Destroying genuine ManualStageObserver Singleton"); + ManualStageObserverExtension._manualStageObserver.destroy(); + ManualStageObserverExtension._manualStageObserver = null; + } + } +} diff --git a/src/robotlegs/bender/extensions/viewManager/StageCrawlerExtension.ts b/src/robotlegs/bender/extensions/viewManager/StageCrawlerExtension.ts new file mode 100644 index 0000000..423afd7 --- /dev/null +++ b/src/robotlegs/bender/extensions/viewManager/StageCrawlerExtension.ts @@ -0,0 +1,82 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import { IContext, IExtension, IInjector, ILogger } from "@robotlegsjs/core"; + +import { IDisplayObjectContainer } from "../../displayList/api/IDisplayObjectContainer"; + +import { IContextView } from "../contextView/api/IContextView"; + +import { IViewManager } from "./api/IViewManager"; +import { ContainerBinding } from "./impl/ContainerBinding"; +import { ContainerRegistry } from "./impl/ContainerRegistry"; +import { StageCrawler } from "./impl/StageCrawler"; + +/** + * View Handlers (like the MediatorMap) handle views as they land on stage. + * + * This extension checks for views that might already be on the stage + * after context initialization and ensures that those views are handled. + */ +export class StageCrawlerExtension implements IExtension { + /*============================================================================*/ + /* Private Properties */ + /*============================================================================*/ + + private _logger: ILogger; + + private _injector: IInjector; + + private _containerRegistry: ContainerRegistry; + + /*============================================================================*/ + /* Public Functions */ + /*============================================================================*/ + + /** + * @inheritDoc + */ + public extend(context: IContext): void { + this._injector = context.injector; + this._logger = context.getLogger(this); + context.afterInitializing(this.afterInitializing.bind(this)); + } + + /*============================================================================*/ + /* Private Functions */ + /*============================================================================*/ + + private afterInitializing(): void { + this._containerRegistry = this._injector.get(ContainerRegistry); + this._injector.isBound(IViewManager) ? this.scanViewManagedContainers() : this.scanContextView(); + } + + private scanViewManagedContainers(): void { + this._logger.debug("ViewManager is installed. Checking for managed containers..."); + let viewManager: IViewManager = this._injector.get(IViewManager); + viewManager.containers.forEach((container: IDisplayObjectContainer) => { + this.scanContainer(container); + }); + } + + private scanContextView(): void { + if (this._injector.isBound(IContextView)) { + this._logger.debug("ViewManager is not installed. Checking the ContextView..."); + let contextView: IContextView = this._injector.get(IContextView); + this.scanContainer(contextView.view); + } else { + this._logger.error("A ContextView must be installed if you install the StageCrawlerExtension."); + } + } + + private scanContainer(container: IDisplayObjectContainer): void { + let binding: ContainerBinding = this._containerRegistry.getBinding(container); + this._logger.debug("StageCrawler scanning container {0} ...", [container]); + new StageCrawler(binding).scan(container); + this._logger.debug("StageCrawler finished scanning {0}", [container]); + } +} diff --git a/src/robotlegs/bender/extensions/viewManager/StageObserverExtension.ts b/src/robotlegs/bender/extensions/viewManager/StageObserverExtension.ts new file mode 100644 index 0000000..59f2cc6 --- /dev/null +++ b/src/robotlegs/bender/extensions/viewManager/StageObserverExtension.ts @@ -0,0 +1,73 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import { IContext, IExtension, IInjector, ILogger } from "@robotlegsjs/core"; + +import { IDisplayObjectObserverFactory } from "../../displayList/api/IDisplayObjectObserverFactory"; + +import { ContainerRegistry } from "./impl/ContainerRegistry"; +import { StageObserver } from "./impl/StageObserver"; + +let installCount: number = 0; + +/** + * This extension install an automatic Stage Observer + */ +export class StageObserverExtension implements IExtension { + /*============================================================================*/ + /* Private Static Properties */ + /*============================================================================*/ + + // Really? Yes, there can be only one. + private static _stageObserver: StageObserver = null; + + /*============================================================================*/ + /* Private Properties */ + /*============================================================================*/ + + private _injector: IInjector; + + private _logger: ILogger; + + /*============================================================================*/ + /* Public Functions */ + /*============================================================================*/ + + /** + * @inheritDoc + */ + public extend(context: IContext): void { + context.whenInitializing(this.whenInitializing.bind(this)); + context.whenDestroying(this.whenDestroying.bind(this)); + installCount++; + this._injector = context.injector; + this._logger = context.getLogger(this); + } + + /*============================================================================*/ + /* Private Functions */ + /*============================================================================*/ + + private whenInitializing(): void { + // Hark, an actual Singleton! + if (!StageObserverExtension._stageObserver) { + let containerRegistry: ContainerRegistry = this._injector.get(ContainerRegistry); + let factory: IDisplayObjectObserverFactory = this._injector.get(IDisplayObjectObserverFactory); + this._logger.debug("Creating genuine StageObserver Singleton"); + StageObserverExtension._stageObserver = new StageObserver(containerRegistry, factory); + } + } + + private whenDestroying(): void { + installCount--; + if (installCount === 0) { + this._logger.debug("Destroying genuine StageObserver Singleton"); + StageObserverExtension._stageObserver.destroy(); + StageObserverExtension._stageObserver = null; + } + } +} diff --git a/src/robotlegs/bender/extensions/viewManager/ViewManagerExtension.ts b/src/robotlegs/bender/extensions/viewManager/ViewManagerExtension.ts new file mode 100644 index 0000000..0ecf840 --- /dev/null +++ b/src/robotlegs/bender/extensions/viewManager/ViewManagerExtension.ts @@ -0,0 +1,71 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import { IContext, IExtension, IInjector } from "@robotlegsjs/core"; + +import { IViewManager } from "../viewManager/api/IViewManager"; +import { ViewManager } from "../viewManager/impl/ViewManager"; + +import { ContainerRegistry } from "./impl/ContainerRegistry"; + +/** + * This extension install a View Manager into the context + */ +export class ViewManagerExtension implements IExtension { + /*============================================================================*/ + /* Private Static Properties */ + /*============================================================================*/ + + // Really? Yes, there can be only one. + private static _containerRegistry: ContainerRegistry; + + /*============================================================================*/ + /* Private Properties */ + /*============================================================================*/ + + private _injector: IInjector; + + private _viewManager: IViewManager; + + /*============================================================================*/ + /* Public Functions */ + /*============================================================================*/ + + /** + * @inheritDoc + */ + public extend(context: IContext): void { + context.whenInitializing(this.whenInitializing.bind(this)); + context.whenDestroying(this.whenDestroying.bind(this)); + + this._injector = context.injector; + + // Just one Container Registry + ViewManagerExtension._containerRegistry = ViewManagerExtension._containerRegistry || new ContainerRegistry(); + this._injector.bind(ContainerRegistry).toConstantValue(ViewManagerExtension._containerRegistry); + + // But you get your own View Manager + this._injector + .bind(IViewManager) + .to(ViewManager) + .inSingletonScope(); + } + + /*============================================================================*/ + /* Private Functions */ + /*============================================================================*/ + + private whenInitializing(): void { + this._viewManager = this._injector.get(IViewManager); + } + + private whenDestroying(): void { + this._viewManager.removeAllHandlers(); + this._injector.unbind(IViewManager); + this._injector.unbind(ContainerRegistry); + } +} diff --git a/src/robotlegs/bender/extensions/viewManager/api/IViewHandler.ts b/src/robotlegs/bender/extensions/viewManager/api/IViewHandler.ts new file mode 100644 index 0000000..6d78a13 --- /dev/null +++ b/src/robotlegs/bender/extensions/viewManager/api/IViewHandler.ts @@ -0,0 +1,22 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import { IClass } from "@robotlegsjs/core"; + +import { IDisplayObject } from "../../../displayList/api/IDisplayObject"; + +/** + * View handler contract + */ +export interface IViewHandler { + /** + * View handler method + * @param view The view instance to handle + * @param type The class of the view instance + */ + handleView(view: IDisplayObject, type: IClass): void; +} diff --git a/src/robotlegs/bender/extensions/viewManager/api/IViewManager.ts b/src/robotlegs/bender/extensions/viewManager/api/IViewManager.ts new file mode 100644 index 0000000..59d85e4 --- /dev/null +++ b/src/robotlegs/bender/extensions/viewManager/api/IViewManager.ts @@ -0,0 +1,57 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import { IEventDispatcher } from "@robotlegsjs/core"; + +import { IDisplayObjectContainer } from "../../../displayList/api/IDisplayObjectContainer"; + +import { IViewHandler } from "./IViewHandler"; + +/*[Event(name="containerAdd", type="robotlegs.bender.extensions.viewManager.impl.ViewManagerEvent")]*/ +/*[Event(name="containerRemove", type="robotlegs.bender.extensions.viewManager.impl.ViewManagerEvent")]*/ +/*[Event(name="handlerAdd", type="robotlegs.bender.extensions.viewManager.impl.ViewManagerEvent")]*/ +/*[Event(name="handlerRemove", type="robotlegs.bender.extensions.viewManager.impl.ViewManagerEvent")]*/ + +/** + * The View Manager allows you to add multiple "view root" containers to a context + */ +export const IViewManager = Symbol("IViewManager"); +export interface IViewManager extends IEventDispatcher { + /** + * A list of currently registered containers + */ + containers: IDisplayObjectContainer[]; + + /** + * Adds a container as a "view root" into the context + * @param container + */ + addContainer(container: IDisplayObjectContainer): void; + + /** + * Removes a container from this context + * @param container + */ + removeContainer(container: IDisplayObjectContainer): void; + + /** + * Registers a view handler + * @param handler + */ + addViewHandler(handler: IViewHandler): void; + + /** + * Removes a view handler + * @param handler + */ + removeViewHandler(handler: IViewHandler): void; + + /** + * Removes all view handlers from this context + */ + removeAllHandlers(): void; +} diff --git a/src/robotlegs/bender/extensions/viewManager/impl/ConfigureViewEvent.ts b/src/robotlegs/bender/extensions/viewManager/impl/ConfigureViewEvent.ts new file mode 100644 index 0000000..d8e75b8 --- /dev/null +++ b/src/robotlegs/bender/extensions/viewManager/impl/ConfigureViewEvent.ts @@ -0,0 +1,60 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import { Event } from "@robotlegsjs/core"; + +import { IDisplayObjectContainer } from "../../../displayList/api/IDisplayObjectContainer"; + +/** + * View Configuration Event + * @private + */ +export class ConfigureViewEvent extends Event { + /*============================================================================*/ + /* Public Static Properties */ + /*============================================================================*/ + + public static CONFIGURE_VIEW: string = "configureView"; + + /*============================================================================*/ + /* Public Properties */ + /*============================================================================*/ + + private _view: IDisplayObjectContainer; + + /** + * The view instance associated with this event + */ + public get view(): IDisplayObjectContainer { + return this._view; + } + + /*============================================================================*/ + /* Constructor */ + /*============================================================================*/ + + /** + * Creates a view configuration event + * @param type The event type + * @param view The associated view instance + */ + constructor(type: string, view: IDisplayObjectContainer) { + super(type, true); + this._view = view; + } + + /*============================================================================*/ + /* Public Functions */ + /*============================================================================*/ + + /** + * @inheritDoc + */ + public clone(): ConfigureViewEvent { + return new ConfigureViewEvent(this.type, this._view); + } +} diff --git a/src/robotlegs/bender/extensions/viewManager/impl/ContainerBinding.ts b/src/robotlegs/bender/extensions/viewManager/impl/ContainerBinding.ts new file mode 100644 index 0000000..ad3b9b4 --- /dev/null +++ b/src/robotlegs/bender/extensions/viewManager/impl/ContainerBinding.ts @@ -0,0 +1,106 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import { IClass, EventDispatcher } from "@robotlegsjs/core"; + +import { IDisplayObject } from "../../../displayList/api/IDisplayObject"; +import { IDisplayObjectContainer } from "../../../displayList/api/IDisplayObjectContainer"; + +import { IViewHandler } from "../api/IViewHandler"; + +import { ContainerBindingEvent } from "./ContainerBindingEvent"; + +/*[Event(name="bindingEmpty", type="robotlegs.bender.extensions.viewManager.impl.ContainerBindingEvent")]*/ +/** + * @private + */ +export class ContainerBinding extends EventDispatcher { + /*============================================================================*/ + /* Public Properties */ + /*============================================================================*/ + + private _parent: ContainerBinding; + + /** + * @private + */ + public get parent(): ContainerBinding { + return this._parent; + } + + /** + * @private + */ + public set parent(value: ContainerBinding) { + this._parent = value; + } + + private _container: IDisplayObjectContainer; + + /** + * @private + */ + public get container(): IDisplayObjectContainer { + return this._container; + } + + /*============================================================================*/ + /* Private Properties */ + /*============================================================================*/ + + private _handlers: IViewHandler[] = []; + + /*============================================================================*/ + /* Constructor */ + /*============================================================================*/ + + /** + * @private + */ + constructor(container: IDisplayObjectContainer) { + super(); + this._container = container; + } + + /*============================================================================*/ + /* Public Functions */ + /*============================================================================*/ + + /** + * @private + */ + public addHandler(handler: IViewHandler): void { + if (this._handlers.indexOf(handler) > -1) { + return; + } + this._handlers.push(handler); + } + + /** + * @private + */ + public removeHandler(handler: IViewHandler): void { + let index: number = this._handlers.indexOf(handler); + if (index > -1) { + this._handlers.splice(index, 1); + if (this._handlers.length === 0) { + this.dispatchEvent(new ContainerBindingEvent(ContainerBindingEvent.BINDING_EMPTY)); + } + } + } + + /** + * @private + */ + public handleView(view: IDisplayObject, type: IClass): void { + let length: number = this._handlers.length; + for (let i: number = 0; i < length; i++) { + let handler: IViewHandler = this._handlers[i]; + handler.handleView(view, type); + } + } +} diff --git a/src/robotlegs/bender/extensions/viewManager/impl/ContainerBindingEvent.ts b/src/robotlegs/bender/extensions/viewManager/impl/ContainerBindingEvent.ts new file mode 100644 index 0000000..009dbf6 --- /dev/null +++ b/src/robotlegs/bender/extensions/viewManager/impl/ContainerBindingEvent.ts @@ -0,0 +1,41 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import { Event } from "@robotlegsjs/core"; + +/** + * @private + */ +export class ContainerBindingEvent extends Event { + /*============================================================================*/ + /* Public Static Properties */ + /*============================================================================*/ + + public static BINDING_EMPTY: string = "bindingEmpty"; + + /*============================================================================*/ + /* Constructor */ + /*============================================================================*/ + + /** + * @private + */ + constructor(type: string) { + super(type); + } + + /*============================================================================*/ + /* Public Functions */ + /*============================================================================*/ + + /** + * @inheritDoc + */ + public clone(): ContainerBindingEvent { + return new ContainerBindingEvent(this.type); + } +} diff --git a/src/robotlegs/bender/extensions/viewManager/impl/ContainerRegistry.ts b/src/robotlegs/bender/extensions/viewManager/impl/ContainerRegistry.ts new file mode 100755 index 0000000..bc110ef --- /dev/null +++ b/src/robotlegs/bender/extensions/viewManager/impl/ContainerRegistry.ts @@ -0,0 +1,184 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import { EventDispatcher } from "@robotlegsjs/core"; + +import { IDisplayObjectContainer } from "../../../displayList/api/IDisplayObjectContainer"; + +import { ContainerBinding } from "./ContainerBinding"; +import { ContainerBindingEvent } from "./ContainerBindingEvent"; +import { ContainerRegistryEvent } from "./ContainerRegistryEvent"; + +/*[Event(name="containerAdd", type="robotlegs.bender.extensions.viewManager.impl.ContainerRegistryEvent")]*/ +/*[Event(name="containerRemove", type="robotlegs.bender.extensions.viewManager.impl.ContainerRegistryEvent")]*/ +/*[Event(name="rootContainerAdd", type="robotlegs.bender.extensions.viewManager.impl.ContainerRegistryEvent")]*/ +/*[Event(name="rootContainerRemove", type="robotlegs.bender.extensions.viewManager.impl.ContainerRegistryEvent")]*/ + +/** + * @private + */ +export class ContainerRegistry extends EventDispatcher { + /*============================================================================*/ + /* Public Properties */ + /*============================================================================*/ + + private _bindings: ContainerBinding[] = []; + + /** + * @private + */ + public get bindings(): ContainerBinding[] { + return this._bindings; + } + + private _rootBindings: ContainerBinding[] = []; + + /** + * @private + */ + public get rootBindings(): ContainerBinding[] { + return this._rootBindings; + } + + /*============================================================================*/ + /* Private Properties */ + /*============================================================================*/ + + private _bindingByContainer: Map = new Map(); + + /*============================================================================*/ + /* Public Functions */ + /*============================================================================*/ + + /** + * @private + */ + public addContainer(container: IDisplayObjectContainer): ContainerBinding { + let binding = this._bindingByContainer.get(container); + if (!binding) { + binding = this.createBinding(container); + this._bindingByContainer.set(container, binding); + } + return binding; + } + + /** + * @private + */ + public removeContainer(container: IDisplayObjectContainer): ContainerBinding { + let binding: ContainerBinding = this._bindingByContainer.get(container); + + if (binding) { + this.removeBinding(binding); + } + + return binding; + } + + /** + * Finds the closest parent binding for a given display object + * + * @private + */ + public findParentBinding(target: IDisplayObjectContainer): ContainerBinding { + let parent: IDisplayObjectContainer = target.parent; + while (parent) { + let binding: ContainerBinding = this._bindingByContainer.get(parent); + if (binding) { + return binding; + } + parent = parent.parent; + } + return null; + } + + /** + * @private + */ + public getBinding(container: IDisplayObjectContainer): ContainerBinding { + return this._bindingByContainer.get(container); + } + + /*============================================================================*/ + /* Private Functions */ + /*============================================================================*/ + + private createBinding(container: IDisplayObjectContainer): ContainerBinding { + let binding: ContainerBinding = new ContainerBinding(container); + this._bindings.push(binding); + + // Add a listener so that we can remove this binding when it has no handlers + binding.addEventListener(ContainerBindingEvent.BINDING_EMPTY, this.onBindingEmpty); + + // If the new binding doesn't have a parent it is a Root + binding.parent = this.findParentBinding(container); + if (!binding.parent) { + this.addRootBinding(binding); + } + + // Reparent any bindings which are contained within the new binding AND + // A. Don't have a parent, OR + // B. Have a parent that is not contained within the new binding + this._bindingByContainer.forEach(childBinding => { + if (container.contains(childBinding.container)) { + if (!childBinding.parent) { + this.removeRootBinding(childBinding); + childBinding.parent = binding; + } else if (!container.contains(childBinding.parent.container)) { + childBinding.parent = binding; + } + } + }); + + this.dispatchEvent(new ContainerRegistryEvent(ContainerRegistryEvent.CONTAINER_ADD, binding.container)); + return binding; + } + + private removeBinding(binding: ContainerBinding): void { + // Remove the binding itself + this._bindingByContainer.delete(binding.container); + let index: number = this._bindings.indexOf(binding); + this._bindings.splice(index, 1); + + // Drop the empty binding listener + binding.removeEventListener(ContainerBindingEvent.BINDING_EMPTY, this.onBindingEmpty); + + if (!binding.parent) { + // This binding didn't have a parent, so it was a Root + this.removeRootBinding(binding); + } + + // Re-parent the bindings + this._bindingByContainer.forEach(childBinding => { + if (childBinding.parent === binding) { + childBinding.parent = binding.parent; + if (!childBinding.parent) { + // This binding used to have a parent, + // but no longer does, so it is now a Root + this.addRootBinding(childBinding); + } + } + }); + + this.dispatchEvent(new ContainerRegistryEvent(ContainerRegistryEvent.CONTAINER_REMOVE, binding.container)); + } + + private addRootBinding(binding: ContainerBinding): void { + this._rootBindings.push(binding); + this.dispatchEvent(new ContainerRegistryEvent(ContainerRegistryEvent.ROOT_CONTAINER_ADD, binding.container)); + } + + private removeRootBinding(binding: ContainerBinding): void { + let index: number = this._rootBindings.indexOf(binding); + this._rootBindings.splice(index, 1); + this.dispatchEvent(new ContainerRegistryEvent(ContainerRegistryEvent.ROOT_CONTAINER_REMOVE, binding.container)); + } + + private onBindingEmpty = (event: ContainerBindingEvent): void => { + this.removeBinding(event.target); + }; +} diff --git a/src/robotlegs/bender/extensions/viewManager/impl/ContainerRegistryEvent.ts b/src/robotlegs/bender/extensions/viewManager/impl/ContainerRegistryEvent.ts new file mode 100644 index 0000000..00efbf3 --- /dev/null +++ b/src/robotlegs/bender/extensions/viewManager/impl/ContainerRegistryEvent.ts @@ -0,0 +1,66 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import { Event } from "@robotlegsjs/core"; + +import { IDisplayObjectContainer } from "../../../displayList/api/IDisplayObjectContainer"; + +/** + * Container existence event + * @private + */ +export class ContainerRegistryEvent extends Event { + /*============================================================================*/ + /* Public Static Properties */ + /*============================================================================*/ + + public static CONTAINER_ADD: string = "containerAdd"; + + public static CONTAINER_REMOVE: string = "containerRemove"; + + public static ROOT_CONTAINER_ADD: string = "rootContainerAdd"; + + public static ROOT_CONTAINER_REMOVE: string = "rootContainerRemove"; + + /*============================================================================*/ + /* Public Properties */ + /*============================================================================*/ + + private _container: IDisplayObjectContainer; + + /** + * The container associated with this event + */ + public get container(): IDisplayObjectContainer { + return this._container; + } + + /*============================================================================*/ + /* Constructor */ + /*============================================================================*/ + + /** + * Creates a new container existence event + * @param type The event type + * @param container The container associated with this event + */ + constructor(type: string, container: IDisplayObjectContainer) { + super(type); + this._container = container; + } + + /*============================================================================*/ + /* Public Functions */ + /*============================================================================*/ + + /** + * @inheritDoc + */ + public clone(): ContainerRegistryEvent { + return new ContainerRegistryEvent(this.type, this._container); + } +} diff --git a/src/robotlegs/bender/extensions/viewManager/impl/ManualStageObserver.ts b/src/robotlegs/bender/extensions/viewManager/impl/ManualStageObserver.ts new file mode 100644 index 0000000..f065522 --- /dev/null +++ b/src/robotlegs/bender/extensions/viewManager/impl/ManualStageObserver.ts @@ -0,0 +1,117 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import { IClass } from "@robotlegsjs/core"; + +import { IDisplayObject } from "../../../displayList/api/IDisplayObject"; +import { IDisplayObjectContainer } from "../../../displayList/api/IDisplayObjectContainer"; +import { IDisplayObjectObserver } from "../../../displayList/api/IDisplayObjectObserver"; +import { IDisplayObjectObserverFactory } from "../../../displayList/api/IDisplayObjectObserverFactory"; + +import { ContainerRegistryEvent } from "./ContainerRegistryEvent"; + +import { ContainerRegistry } from "./ContainerRegistry"; +import { ContainerBinding } from "./ContainerBinding"; + +/** + * @private + */ +export class ManualStageObserver { + /*============================================================================*/ + /* Private Properties */ + /*============================================================================*/ + + private _registry: ContainerRegistry; + + private _displayObjectObserverFactory: IDisplayObjectObserverFactory; + + private _observers: Map = new Map(); + + /*============================================================================*/ + /* Constructor */ + /*============================================================================*/ + + /** + * @private + */ + constructor(containerRegistry: ContainerRegistry, displayObjectObserverFactory: IDisplayObjectObserverFactory) { + this._registry = containerRegistry; + this._displayObjectObserverFactory = displayObjectObserverFactory; + + // We care about all containers (not just roots) + this._registry.addEventListener(ContainerRegistryEvent.CONTAINER_ADD, this.onContainerAdd); + this._registry.addEventListener(ContainerRegistryEvent.CONTAINER_REMOVE, this.onContainerRemove); + + // We might have arrived late on the scene + this._registry.bindings.forEach((binding: ContainerBinding) => { + this.addContainerListener(binding.container); + }); + } + + /*============================================================================*/ + /* Public Functions */ + /*============================================================================*/ + + /** + * @private + */ + public destroy(): void { + if (this._registry) { + this._registry.removeEventListener(ContainerRegistryEvent.CONTAINER_ADD, this.onContainerAdd); + this._registry.removeEventListener(ContainerRegistryEvent.CONTAINER_REMOVE, this.onContainerRemove); + + this._registry.rootBindings.forEach((binding: ContainerBinding) => { + this.removeContainerListener(binding.container); + }); + } + + if (this._observers) { + this._observers.forEach((observer: IDisplayObjectObserver) => { + observer.destroy(); + }); + } + + this._registry = null; + this._displayObjectObserverFactory = null; + this._observers = null; + } + + /*============================================================================*/ + /* Private Functions */ + /*============================================================================*/ + + private onContainerAdd = (event: ContainerRegistryEvent): void => { + this.addContainerListener(event.container); + }; + + private onContainerRemove = (event: ContainerRegistryEvent): void => { + this.removeContainerListener(event.container); + }; + + private addContainerListener(container: IDisplayObjectContainer): void { + if (!this._observers.has(container)) { + // We're interested in ALL container bindings + // but just for normal, bubbling events + let observer: IDisplayObjectObserver = this._displayObjectObserverFactory(container, true); + observer.addConfigureViewHandler(this.onConfigureView); + this._observers.set(container, observer); + } + } + + private removeContainerListener(container: IDisplayObjectContainer): void { + if (this._observers.has(container)) { + let observer: IDisplayObjectObserver = this._observers.get(container); + observer.destroy(); + this._observers.delete(container); + } + } + + private onConfigureView = (container: IDisplayObjectContainer, view: IDisplayObject): void => { + let type: IClass = >view.constructor; + this._registry.getBinding(container).handleView(view, type); + }; +} diff --git a/src/robotlegs/bender/extensions/viewManager/impl/StageCrawler.ts b/src/robotlegs/bender/extensions/viewManager/impl/StageCrawler.ts new file mode 100644 index 0000000..d53dd28 --- /dev/null +++ b/src/robotlegs/bender/extensions/viewManager/impl/StageCrawler.ts @@ -0,0 +1,78 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import { IClass } from "@robotlegsjs/core"; + +import { IDisplayObject } from "../../../displayList/api/IDisplayObject"; +import { IDisplayObjectContainer } from "../../../displayList/api/IDisplayObjectContainer"; + +import { ContainerBinding } from "./ContainerBinding"; + +/** + * @private + */ +export class StageCrawler { + /*============================================================================*/ + /* Private Properties */ + /*============================================================================*/ + + private _binding: ContainerBinding; + + /*============================================================================*/ + /* Constructor */ + /*============================================================================*/ + + /** + * @private + */ + constructor(containerBinding: ContainerBinding) { + this._binding = containerBinding; + } + + /*============================================================================*/ + /* Public Functions */ + /*============================================================================*/ + + /** + * @private + */ + public scan(container: IDisplayObjectContainer): void { + this.scanContainer(container); + } + + /*============================================================================*/ + /* Private Functions */ + /*============================================================================*/ + + private scanContainer(container: IDisplayObjectContainer): void { + this.processView(container); + + if (container.children !== undefined) { + container.children.forEach((child: IDisplayObject) => { + if ((child).children !== undefined) { + this.scanContainer(child); + } else { + this.processView(child); + } + }); + } else if (container.numChildren !== undefined && container.getChildAt !== undefined) { + for (let i: number = 0; i < container.numChildren; i++) { + let child: any = container.getChildAt(i); + + if (child.numChildren !== undefined && child.getChildAt !== undefined) { + this.scanContainer(child); + } else { + this.processView(child); + } + } + } + } + + private processView(view: IDisplayObject): void { + this._binding.handleView(view, >view.constructor); + } +} diff --git a/src/robotlegs/bender/extensions/viewManager/impl/StageObserver.ts b/src/robotlegs/bender/extensions/viewManager/impl/StageObserver.ts new file mode 100644 index 0000000..fa97abf --- /dev/null +++ b/src/robotlegs/bender/extensions/viewManager/impl/StageObserver.ts @@ -0,0 +1,120 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import { IClass } from "@robotlegsjs/core"; + +import { IDisplayObject } from "../../../displayList/api/IDisplayObject"; +import { IDisplayObjectContainer } from "../../../displayList/api/IDisplayObjectContainer"; +import { IDisplayObjectObserver } from "../../../displayList/api/IDisplayObjectObserver"; +import { IDisplayObjectObserverFactory } from "../../../displayList/api/IDisplayObjectObserverFactory"; + +import { ContainerBinding } from "./ContainerBinding"; +import { ContainerRegistry } from "./ContainerRegistry"; +import { ContainerRegistryEvent } from "./ContainerRegistryEvent"; + +/** + * @private + */ +export class StageObserver { + /*============================================================================*/ + /* Private Properties */ + /*============================================================================*/ + + private _registry: ContainerRegistry; + + private _displayObjectObserverFactory: IDisplayObjectObserverFactory; + + private _observers: Map = new Map(); + + /*============================================================================*/ + /* Constructor */ + /*============================================================================*/ + + /** + * @private + */ + constructor(containerRegistry: ContainerRegistry, displayObjectObserverFactory: IDisplayObjectObserverFactory) { + this._registry = containerRegistry; + this._displayObjectObserverFactory = displayObjectObserverFactory; + + // We only care about roots + this._registry.addEventListener(ContainerRegistryEvent.ROOT_CONTAINER_ADD, this.onRootContainerAdd); + this._registry.addEventListener(ContainerRegistryEvent.ROOT_CONTAINER_REMOVE, this.onRootContainerRemove); + + // We might have arrived late on the scene + this._registry.rootBindings.forEach((binding: ContainerBinding) => { + this.addRootListener(binding.container); + }); + } + + /*============================================================================*/ + /* Public Functions */ + /*============================================================================*/ + + /** + * @private + */ + public destroy(): void { + if (this._registry) { + this._registry.removeEventListener(ContainerRegistryEvent.ROOT_CONTAINER_ADD, this.onRootContainerAdd); + this._registry.removeEventListener(ContainerRegistryEvent.ROOT_CONTAINER_REMOVE, this.onRootContainerRemove); + + this._registry.rootBindings.forEach((binding: ContainerBinding) => { + this.removeRootListener(binding.container); + }); + } + + if (this._observers) { + this._observers.forEach((observer: IDisplayObjectObserver) => { + observer.destroy(); + }); + } + + this._registry = null; + this._displayObjectObserverFactory = null; + this._observers = null; + } + + /*============================================================================*/ + /* Private Functions */ + /*============================================================================*/ + + private onRootContainerAdd = (event: ContainerRegistryEvent): void => { + this.addRootListener(event.container); + }; + + private onRootContainerRemove = (event: ContainerRegistryEvent): void => { + this.removeRootListener(event.container); + }; + + private addRootListener(container: IDisplayObjectContainer): void { + if (!this._observers.has(container)) { + let observer: IDisplayObjectObserver = this._displayObjectObserverFactory(container, true); + observer.addAddedToStageHandler(this.onViewAddedToStage); + this._observers.set(container, observer); + } + } + + private removeRootListener(container: IDisplayObjectContainer): void { + if (this._observers.has(container)) { + let observer: IDisplayObjectObserver = this._observers.get(container); + observer.destroy(); + this._observers.delete(container); + } + } + + private onViewAddedToStage = (view: IDisplayObjectContainer): void => { + let type: IClass = >view.constructor; + + // Walk upwards from the nearest binding + let binding: ContainerBinding = this._registry.findParentBinding(view); + while (binding) { + binding.handleView(view, type); + binding = binding.parent; + } + }; +} diff --git a/src/robotlegs/bender/extensions/viewManager/impl/ViewManager.ts b/src/robotlegs/bender/extensions/viewManager/impl/ViewManager.ts new file mode 100644 index 0000000..77d309e --- /dev/null +++ b/src/robotlegs/bender/extensions/viewManager/impl/ViewManager.ts @@ -0,0 +1,169 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import { injectable, inject, EventDispatcher } from "@robotlegsjs/core"; + +import { IDisplayObjectContainer } from "../../../displayList/api/IDisplayObjectContainer"; + +import { IViewHandler } from "../api/IViewHandler"; +import { IViewManager } from "../api/IViewManager"; + +import { ViewManagerEvent } from "./ViewManagerEvent"; + +import { ContainerRegistry } from "../impl/ContainerRegistry"; +import { ContainerBinding } from "../impl/ContainerBinding"; + +/*[Event(name="containerAdd", type="robotlegs.bender.extensions.viewManager.impl.ViewManagerEvent")]*/ +/*[Event(name="containerRemove", type="robotlegs.bender.extensions.viewManager.impl.ViewManagerEvent")]*/ +/*[Event(name="handlerAdd", type="robotlegs.bender.extensions.viewManager.impl.ViewManagerEvent")]*/ +/*[Event(name="handlerRemove", type="robotlegs.bender.extensions.viewManager.impl.ViewManagerEvent")]*/ + +/** + * @private + */ +@injectable() +export class ViewManager extends EventDispatcher implements IViewManager { + /*============================================================================*/ + /* Public Properties */ + /*============================================================================*/ + + private _containers: IDisplayObjectContainer[] = []; + + /** + * @inheritDoc + */ + public get containers(): IDisplayObjectContainer[] { + return this._containers; + } + + /*============================================================================*/ + /* Private Properties */ + /*============================================================================*/ + + private _handlers: IViewHandler[] = []; + + private _registry: ContainerRegistry; + + /*============================================================================*/ + /* Constructor */ + /*============================================================================*/ + + /** + * @private + */ + constructor(@inject(ContainerRegistry) containerRegistry: ContainerRegistry) { + super(); + this._registry = containerRegistry; + } + + /*============================================================================*/ + /* Public Functions */ + /*============================================================================*/ + + /** + * @inheritDoc + */ + public addContainer(container: IDisplayObjectContainer): void { + if (!this.validContainer(container)) { + return; + } + + this._containers.push(container); + this._handlers.forEach(handler => { + this._registry.addContainer(container).addHandler(handler); + }); + + this.dispatchEvent(new ViewManagerEvent(ViewManagerEvent.CONTAINER_ADD, container)); + } + + /** + * @inheritDoc + */ + public removeContainer(container: IDisplayObjectContainer): void { + let index: number = this._containers.indexOf(container); + + if (index === -1) { + return; + } + + this._containers.splice(index, 1); + + let binding: ContainerBinding = this._registry.getBinding(container); + + this._handlers.forEach(handler => { + binding.removeHandler(handler); + }); + + this.dispatchEvent(new ViewManagerEvent(ViewManagerEvent.CONTAINER_REMOVE, container)); + } + + /** + * @inheritDoc + */ + public addViewHandler(handler: IViewHandler): void { + if (this._handlers.indexOf(handler) !== -1) { + return; + } + + this._handlers.push(handler); + this._containers.forEach(container => { + this._registry.addContainer(container).addHandler(handler); + }); + + this.dispatchEvent(new ViewManagerEvent(ViewManagerEvent.HANDLER_ADD, null, handler)); + } + + /** + * @inheritDoc + */ + public removeViewHandler(handler: IViewHandler): void { + let index: number = this._handlers.indexOf(handler); + + if (index === -1) { + return; + } + + this._handlers.splice(index, 1); + + this._containers.forEach(container => { + this._registry.getBinding(container).removeHandler(handler); + }); + + this.dispatchEvent(new ViewManagerEvent(ViewManagerEvent.HANDLER_REMOVE, null, handler)); + } + + /** + * @inheritDoc + */ + public removeAllHandlers(): void { + let binding: ContainerBinding = null; + this._containers.forEach(container => { + binding = this._registry.getBinding(container); + this._handlers.forEach(handler => { + binding.removeHandler(handler); + }); + }); + } + + /*============================================================================*/ + /* Private Functions */ + /*============================================================================*/ + + private validContainer(container: IDisplayObjectContainer): boolean { + let isValid: boolean = this._containers.indexOf(container) < 0; + + if (isValid) { + this._containers.forEach(registeredContainer => { + if (registeredContainer.contains(container) || container.contains(registeredContainer)) { + throw new Error("Containers can not be nested"); + } + }); + } + + return isValid; + } +} diff --git a/src/robotlegs/bender/extensions/viewManager/impl/ViewManagerEvent.ts b/src/robotlegs/bender/extensions/viewManager/impl/ViewManagerEvent.ts new file mode 100644 index 0000000..d5c66e6 --- /dev/null +++ b/src/robotlegs/bender/extensions/viewManager/impl/ViewManagerEvent.ts @@ -0,0 +1,79 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import { Event } from "@robotlegsjs/core"; + +import { IDisplayObjectContainer } from "../../../displayList/api/IDisplayObjectContainer"; + +import { IViewHandler } from "../api/IViewHandler"; + +/** + * Container existence event + * @private + */ +export class ViewManagerEvent extends Event { + /*============================================================================*/ + /* Public Static Properties */ + /*============================================================================*/ + + public static CONTAINER_ADD: string = "containerAdd"; + + public static CONTAINER_REMOVE: string = "containerRemove"; + + public static HANDLER_ADD: string = "handlerAdd"; + + public static HANDLER_REMOVE: string = "handlerRemove"; + + /*============================================================================*/ + /* Public Properties */ + /*============================================================================*/ + + private _container: IDisplayObjectContainer; + + /** + * The container associated with this event + */ + public get container(): IDisplayObjectContainer { + return this._container; + } + + private _handler: IViewHandler; + + /** + * The view handler associated with this event + */ + public get handler(): IViewHandler { + return this._handler; + } + + /*============================================================================*/ + /* Constructor */ + /*============================================================================*/ + + /** + * Creates a view manager event + * @param type The event type + * @param container The container associated with this event + * @param handler The view handler associated with this event + */ + constructor(type: string, container?: IDisplayObjectContainer, handler?: IViewHandler) { + super(type); + this._container = container; + this._handler = handler; + } + + /*============================================================================*/ + /* Public Functions */ + /*============================================================================*/ + + /** + * @inheritDoc + */ + public clone(): ViewManagerEvent { + return new ViewManagerEvent(this.type, this._container, this._handler); + } +} diff --git a/test/README.md b/test/README.md new file mode 100644 index 0000000..463dfc3 --- /dev/null +++ b/test/README.md @@ -0,0 +1,3 @@ +# Robotlegs Testing + +Unit tests are written using Mocha, Chai and Sinon. \ No newline at end of file diff --git a/test/createjs/robotlegs/bender/displayList/support/DisplayObjectObserver.ts b/test/createjs/robotlegs/bender/displayList/support/DisplayObjectObserver.ts new file mode 100644 index 0000000..e08aef2 --- /dev/null +++ b/test/createjs/robotlegs/bender/displayList/support/DisplayObjectObserver.ts @@ -0,0 +1,125 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import { IDisplayObject } from "../../../../../../src/robotlegs/bender/displayList/api/IDisplayObject"; +import { IDisplayObjectObserver } from "../../../../../../src/robotlegs/bender/displayList/api/IDisplayObjectObserver"; + +import { ConfigureViewEvent } from "../../../../../../src/robotlegs/bender/extensions/viewManager/impl/ConfigureViewEvent"; + +/** + * + */ +export class DisplayObjectObserver implements IDisplayObjectObserver { + private _displayObject: createjs.DisplayObject; + private _useCapture: boolean; + + private _addedToStageHandler: Function; + private _removedFromStageHandler: Function; + private _configureViewHandler: Function; + + /*============================================================================*/ + /* Constructor */ + /*============================================================================*/ + + /** + * + * @param displayObject + * @param useCapture + */ + constructor(displayObject: IDisplayObject, useCapture: boolean) { + if (displayObject !== null && displayObject !== undefined) { + this._displayObject = displayObject; + this._useCapture = useCapture; + } else { + throw new Error("DisplayObject can't be null or undefined"); + } + } + + /*============================================================================*/ + /* Public Functions */ + /*============================================================================*/ + + /** + * + * @param handler + */ + public addAddedToStageHandler(handler: Function): void { + if (handler !== null && handler !== undefined && this._displayObject.addEventListener !== undefined) { + this._addedToStageHandler = handler; + this._displayObject.addEventListener("added", this.onAddedToStage, this._useCapture); + } + } + + /** + * + * @param handler + */ + public addRemovedFromStageHandler(handler: Function): void { + if (handler !== null && handler !== undefined && this._displayObject.addEventListener !== undefined) { + this._removedFromStageHandler = handler; + this._displayObject.addEventListener("removed", this.onRemovedFromStage, this._useCapture); + } + } + + /** + * + * @param handler + */ + public addConfigureViewHandler(handler: Function): void { + if (handler !== null && handler !== undefined && this._displayObject.addEventListener !== undefined) { + this._configureViewHandler = handler; + this._displayObject.addEventListener(ConfigureViewEvent.CONFIGURE_VIEW, this.onConfigureView, this._useCapture); + } + } + + /** + * + */ + public destroy(): void { + if (this._displayObject.removeEventListener !== undefined) { + this._displayObject.removeEventListener("added", this.onAddedToStage, this._useCapture); + this._displayObject.removeEventListener("removed", this.onRemovedFromStage, this._useCapture); + this._displayObject.removeEventListener(ConfigureViewEvent.CONFIGURE_VIEW, this.onConfigureView, this._useCapture); + } + + this._displayObject = null; + + this._addedToStageHandler = null; + this._removedFromStageHandler = null; + this._configureViewHandler = null; + } + + /*============================================================================*/ + /* Private Functions */ + /*============================================================================*/ + + private onAddedToStage = (event: Event): void => { + this._addedToStageHandler(event.target); + }; + + private onRemovedFromStage = (event: Event): void => { + this._removedFromStageHandler(event.target); + }; + + private onConfigureView = (event: ConfigureViewEvent): void => { + // Stop that event! + event.stopPropagation(); + + this._configureViewHandler(event.currentTarget, event.target); + }; + + /*============================================================================*/ + /* Public Properties */ + /*============================================================================*/ + + /** + * The display object + */ + public get displayObject(): createjs.DisplayObject { + return this._displayObject; + } +} diff --git a/test/createjs/robotlegs/bender/extensions/contextView/contextViewExtension.test.ts b/test/createjs/robotlegs/bender/extensions/contextView/contextViewExtension.test.ts new file mode 100644 index 0000000..0843345 --- /dev/null +++ b/test/createjs/robotlegs/bender/extensions/contextView/contextViewExtension.test.ts @@ -0,0 +1,76 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import "../../../../../entry"; + +import { assert } from "chai"; + +import { IContext, Context, LogLevel } from "@robotlegsjs/core"; + +import { IContextView } from "../../../../../../src/robotlegs/bender/extensions/contextView/api/IContextView"; +import { ContextView } from "../../../../../../src/robotlegs/bender/extensions/contextView/impl/ContextView"; +import { ContextViewExtension } from "../../../../../../src/robotlegs/bender/extensions/contextView/ContextViewExtension"; + +import { CallbackLogTarget } from "./support/CallbackLogTarget"; +import { LogParams } from "./support/LogParams"; + +describe("ContextViewExtension", () => { + let context: IContext; + + beforeEach(() => { + context = new Context(); + }); + + afterEach(() => { + context.destroy(); + context = null; + }); + + it("installing_after_initialization_throws_error", () => { + function installExtensionAfterInitialization(): void { + context.initialize(); + context.install(ContextViewExtension); + } + assert.throws(installExtensionAfterInitialization, Error); + }); + + it("contextView_is_mapped", () => { + let stage: createjs.Stage = new createjs.Stage("canvas"); + let actual: ContextView = null; + context.install(ContextViewExtension).configure(new ContextView(stage)); + context.whenInitializing(function(): void { + actual = context.injector.get(IContextView); + }); + context.initialize(); + assert.equal(actual.view, stage); + }); + + it("second_displayObjectContainer_is_ignored", () => { + let stage: createjs.Stage = new createjs.Stage("canvas"); + let actual: ContextView = null; + let secondStage: createjs.Stage = new createjs.Stage("canvas2"); + context.install(ContextViewExtension).configure(new ContextView(stage), new ContextView(secondStage)); + context.whenInitializing(function(): void { + actual = context.injector.get(IContextView); + }); + context.initialize(); + assert.equal(actual.view, stage); + }); + + it("extension_logs_error_when_context_initialized_with_no_contextView", () => { + let errorLogged: boolean = false; + let logTarget: CallbackLogTarget = new CallbackLogTarget(function(log: LogParams): void { + if (log.source instanceof ContextViewExtension && log.level === LogLevel.ERROR) { + errorLogged = true; + } + }); + context.install(ContextViewExtension); + context.addLogTarget(logTarget); + context.initialize(); + assert.isTrue(errorLogged); + }); +}); diff --git a/test/createjs/robotlegs/bender/extensions/contextView/impl/contextView.test.ts b/test/createjs/robotlegs/bender/extensions/contextView/impl/contextView.test.ts new file mode 100644 index 0000000..996e73c --- /dev/null +++ b/test/createjs/robotlegs/bender/extensions/contextView/impl/contextView.test.ts @@ -0,0 +1,47 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import "../../../../../../entry"; + +import { assert } from "chai"; + +import { IContextView } from "../../../../../../../src/robotlegs/bender/extensions/contextView/api/IContextView"; +import { ContextView } from "../../../../../../../src/robotlegs/bender/extensions/contextView/impl/ContextView"; + +describe("ContextView", () => { + let stage: createjs.Stage; + let contextView: IContextView; + + beforeEach(() => { + stage = new createjs.Stage("canvas"); + contextView = new ContextView(stage); + }); + + afterEach(() => { + contextView = null; + stage = null; + }); + + it("container_is_stored", () => { + assert.isNotNull(contextView.view); + assert.equal(contextView.view, stage); + }); + + it("ContextView_throws_a_error_when_view_is_null", () => { + function inicializeContextViewWithNullView(): void { + contextView = new ContextView(null); + } + assert.throws(inicializeContextViewWithNullView, Error); + }); + + it("ContextView_throws_a_error_when_view_is_undefined", () => { + function inicializeContextViewWithUndefinedView(): void { + contextView = new ContextView(undefined); + } + assert.throws(inicializeContextViewWithUndefinedView, Error); + }); +}); diff --git a/test/createjs/robotlegs/bender/extensions/contextView/impl/contextViewListenerConfig.test.ts b/test/createjs/robotlegs/bender/extensions/contextView/impl/contextViewListenerConfig.test.ts new file mode 100644 index 0000000..2773daa --- /dev/null +++ b/test/createjs/robotlegs/bender/extensions/contextView/impl/contextViewListenerConfig.test.ts @@ -0,0 +1,46 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import "../../../../../../entry"; + +import { assert } from "chai"; + +import { IContextView } from "../../../../../../../src/robotlegs/bender/extensions/contextView/api/IContextView"; +import { ContextView } from "../../../../../../../src/robotlegs/bender/extensions/contextView/impl/ContextView"; +import { ContextViewListenerConfig } from "../../../../../../../src/robotlegs/bender/extensions/contextView/impl/ContextViewListenerConfig"; + +import { ContainerRegistry } from "../../../../../../../src/robotlegs/bender/extensions/viewManager/impl/ContainerRegistry"; +import { ViewManager } from "../../../../../../../src/robotlegs/bender/extensions/viewManager/impl/ViewManager"; + +describe("ContextViewListenerConfig", () => { + let stage: createjs.Stage; + let contextView: IContextView; + let containerRegistry: ContainerRegistry; + let viewManager: ViewManager; + let contextViewListenerConfig: ContextViewListenerConfig; + + beforeEach(() => { + stage = new createjs.Stage("canvas"); + contextView = new ContextView(stage); + containerRegistry = new ContainerRegistry(); + viewManager = new ViewManager(containerRegistry); + contextViewListenerConfig = new ContextViewListenerConfig(contextView, viewManager); + }); + + afterEach(() => { + contextView = null; + stage = null; + containerRegistry = null; + viewManager = null; + contextViewListenerConfig = null; + }); + + it("container_is_added_to_view_manager", () => { + contextViewListenerConfig.configure(); + assert.deepEqual(viewManager.containers, [stage]); + }); +}); diff --git a/test/createjs/robotlegs/bender/extensions/contextView/support/CallbackLogTarget.ts b/test/createjs/robotlegs/bender/extensions/contextView/support/CallbackLogTarget.ts new file mode 100644 index 0000000..fb3f674 --- /dev/null +++ b/test/createjs/robotlegs/bender/extensions/contextView/support/CallbackLogTarget.ts @@ -0,0 +1,24 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import { ILogTarget } from "@robotlegsjs/core"; + +import { LogParams } from "./LogParams"; + +export class CallbackLogTarget implements ILogTarget { + protected _callback: Function; + + constructor(callback: Function) { + this._callback = callback; + } + + public log(source: any, level: number, timestamp: number, message: string, params: any[]): void { + if (this._callback) { + this._callback(new LogParams(source, level, timestamp, message, params)); + } + } +} diff --git a/test/createjs/robotlegs/bender/extensions/contextView/support/LogParams.ts b/test/createjs/robotlegs/bender/extensions/contextView/support/LogParams.ts new file mode 100644 index 0000000..de2c051 --- /dev/null +++ b/test/createjs/robotlegs/bender/extensions/contextView/support/LogParams.ts @@ -0,0 +1,16 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +export class LogParams { + constructor(public source: any, public level: number, public timestamp: number, public message: string, public params: any[]) { + this.source = source; + this.level = level; + this.timestamp = timestamp; + this.message = message; + this.params = params; + } +} diff --git a/test/createjs/robotlegs/bender/extensions/mediatorMap/impl/mediatorFactory.test.ts b/test/createjs/robotlegs/bender/extensions/mediatorMap/impl/mediatorFactory.test.ts new file mode 100644 index 0000000..c84ebdb --- /dev/null +++ b/test/createjs/robotlegs/bender/extensions/mediatorMap/impl/mediatorFactory.test.ts @@ -0,0 +1,239 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import "../../../../../../entry"; + +import sinon = require("sinon"); + +import { assert } from "chai"; + +import { interfaces, IInjector, ITypeFilter, RobotlegsInjector, TypeMatcher } from "@robotlegsjs/core"; + +import { IDisplayObject } from "../../../../../../../src/robotlegs/bender/displayList/api/IDisplayObject"; +import { IDisplayObjectObserver } from "../../../../../../../src/robotlegs/bender/displayList/api/IDisplayObjectObserver"; +import { IDisplayObjectObserverFactory } from "../../../../../../../src/robotlegs/bender/displayList/api/IDisplayObjectObserverFactory"; + +import { IMediator } from "../../../../../../../src/robotlegs/bender/extensions/mediatorMap/api/IMediator"; +import { IMediatorMapping } from "../../../../../../../src/robotlegs/bender/extensions/mediatorMap/api/IMediatorMapping"; +import { MediatorFactory } from "../../../../../../../src/robotlegs/bender/extensions/mediatorMap/impl/MediatorFactory"; +import { MediatorMapping } from "../../../../../../../src/robotlegs/bender/extensions/mediatorMap/impl/MediatorMapping"; +import { MediatorManager } from "../../../../../../../src/robotlegs/bender/extensions/mediatorMap/impl/MediatorManager"; + +import { DisplayObjectObserver } from "../../../displayList/support/DisplayObjectObserver"; + +import { CallbackHook } from "../support/CallbackHook"; +import { CallbackMediator } from "../support/CallbackMediator"; +import { GrumpyGuard } from "../support/GrumpyGuard"; +import { HappyGuard } from "../support/HappyGuard"; +import { InjectedMediator } from "../support/InjectedMediator"; +import { MediatorHook } from "../support/MediatorHook"; +import { ViewInjectedMediator } from "../support/ViewInjectedMediator"; +import { ViewInjectedAsRequestedMediator } from "../support/ViewInjectedAsRequestedMediator"; + +describe("MediatorFactory", () => { + let injector: IInjector = null; + let manager: MediatorManager = null; + let factory: MediatorFactory = null; + + beforeEach(() => { + injector = new RobotlegsInjector(); + injector.bind>(IDisplayObjectObserverFactory).toFactory(() => { + return (view: IDisplayObject, useCapture: boolean): IDisplayObjectObserver => { + return new DisplayObjectObserver(view, useCapture); + }; + }); + factory = new MediatorFactory(injector); + }); + + afterEach(() => { + injector = null; + manager = null; + factory = null; + }); + + function createTypeFilter(allOf: any[], anyOf: any[] = null, noneOf: any[] = null): ITypeFilter { + const matcher: TypeMatcher = new TypeMatcher(); + + if (allOf) { + matcher.allOf(allOf); + } + if (anyOf) { + matcher.anyOf(anyOf); + } + if (noneOf) { + matcher.noneOf(noneOf); + } + + return matcher.createTypeFilter(); + } + + function hookCallCount(...hooks: any[]): number { + let callCount: number = 0; + injector + .bind("Function") + .toFunction(() => { + callCount++; + }) + .whenTargetNamed("hookCallback"); + const mapping: MediatorMapping = new MediatorMapping(createTypeFilter([createjs.Container]), CallbackMediator); + mapping.withHooks.apply(mapping, hooks); + factory.createMediators(new createjs.Container(), createjs.Container, [mapping]); + return callCount; + } + + function mediatorsCreatedWithGuards(...guards: any[]): number { + const mapping: MediatorMapping = new MediatorMapping(createTypeFilter([createjs.Container]), CallbackMediator); + mapping.withGuards(guards); + const mediators: any[] = factory.createMediators(new createjs.Container(), createjs.Container, [mapping]); + return mediators.length; + } + + it("mediator_is_created", () => { + const mapping: IMediatorMapping = new MediatorMapping(createTypeFilter([createjs.Container]), CallbackMediator); + const mediator: IMediator = factory.createMediators(new createjs.Container(), createjs.Container, [mapping])[0]; + assert.instanceOf(mediator, CallbackMediator); + }); + + it("mediator_is_injected_into", () => { + const expected: number = 128; + const mapping: IMediatorMapping = new MediatorMapping(createTypeFilter([createjs.Container]), InjectedMediator); + injector.bind(Number).toConstantValue(expected); + const mediator: InjectedMediator = factory.createMediators(new createjs.Container(), createjs.Container, [mapping])[0]; + assert.equal(mediator.number, expected); + }); + + it("mediatedItem_is_injected_as_exact_type_into_mediator", () => { + const expected: createjs.Container = new createjs.Container(); + const mapping: IMediatorMapping = new MediatorMapping(createTypeFilter([createjs.Container]), ViewInjectedMediator); + const mediator: ViewInjectedMediator = factory.createMediators(expected, createjs.Container, [mapping])[0]; + assert.equal(mediator.mediatedItem, expected); + }); + + it("mediatedItem_is_injected_as_requested_type_into_mediator", () => { + const expected: createjs.Container = new createjs.Container(); + const mapping: MediatorMapping = new MediatorMapping(createTypeFilter([createjs.DisplayObject]), ViewInjectedAsRequestedMediator); + const mediator: ViewInjectedAsRequestedMediator = factory.createMediators(expected, createjs.Container, [mapping])[0]; + assert.equal(mediator.mediatedItem, expected); + }); + + it("hooks_are_called", () => { + assert.equal(hookCallCount(CallbackHook, CallbackHook), 2); + }); + + it("hook_receives_mediator_and_mediatedItem", () => { + const mediatedItem: createjs.Container = new createjs.Container(); + let injectedMediator: ViewInjectedMediator = null; + let injectedView: createjs.Container = null; + injector + .bind("Function") + .toFunction((hook: MediatorHook) => { + injectedMediator = hook.mediator; + injectedView = hook.mediatedItem; + }) + .whenTargetNamed("callback"); + const mapping: MediatorMapping = new MediatorMapping(createTypeFilter([createjs.Container]), ViewInjectedMediator); + mapping.withHooks(MediatorHook); + factory.createMediators(mediatedItem, createjs.Container, [mapping]); + assert.instanceOf(injectedMediator, ViewInjectedMediator); + assert.equal(injectedView, mediatedItem); + }); + + it("mediator_is_created_when_the_guard_allows", () => { + assert.equal(mediatorsCreatedWithGuards(HappyGuard), 1); + }); + + it("mediator_is_created_when_all_guards_allow", () => { + assert.equal(mediatorsCreatedWithGuards(HappyGuard, HappyGuard), 1); + }); + + it("mediator_is_not_created_when_the_guard_denies", () => { + assert.equal(mediatorsCreatedWithGuards(GrumpyGuard), 0); + }); + + it("mediator_is_not_created_when_any_guards_denies", () => { + assert.equal(mediatorsCreatedWithGuards(HappyGuard, GrumpyGuard), 0); + }); + + it("mediator_is_not_created_when_all_guards_deny", () => { + assert.equal(mediatorsCreatedWithGuards(GrumpyGuard, GrumpyGuard), 0); + }); + + it("same_mediators_are_returned_for_mappings_and_mediatedItem", () => { + const mediatedItem: createjs.Container = new createjs.Container(); + const mapping1: MediatorMapping = new MediatorMapping(createTypeFilter([createjs.Container]), ViewInjectedMediator); + const mapping2: MediatorMapping = new MediatorMapping(createTypeFilter([createjs.DisplayObject]), ViewInjectedAsRequestedMediator); + const mediators1: any[] = factory.createMediators(mediatedItem, createjs.Container, [mapping1, mapping2]); + const mediators2: any[] = factory.createMediators(mediatedItem, createjs.Container, [mapping1, mapping2]); + assert.deepEqual(mediators1, mediators2); + }); + + it("expected_number_of_mediators_are_returned_for_mappings_and_mediatedItem", () => { + const mediatedItem: createjs.Container = new createjs.Container(); + const mapping1: MediatorMapping = new MediatorMapping(createTypeFilter([createjs.Container]), ViewInjectedMediator); + const mapping2: MediatorMapping = new MediatorMapping(createTypeFilter([createjs.DisplayObject]), ViewInjectedAsRequestedMediator); + const mediators: any = factory.createMediators(mediatedItem, createjs.Container, [mapping1, mapping2]); + assert.equal(mediators.length, 2); + }); + + it("getMediator", () => { + const mediatedItem: createjs.Container = new createjs.Container(); + const mapping: IMediatorMapping = new MediatorMapping(createTypeFilter([createjs.Container]), CallbackMediator); + factory.createMediators(mediatedItem, createjs.Container, [mapping]); + assert.isNotNull(factory.getMediator(mediatedItem, mapping)); + }); + + it("removeMediator", () => { + const mediatedItem: createjs.Container = new createjs.Container(); + const mapping: IMediatorMapping = new MediatorMapping(createTypeFilter([createjs.Container]), CallbackMediator); + factory.createMediators(mediatedItem, createjs.Container, [mapping]); + factory.removeMediators(mediatedItem); + assert.isNull(factory.getMediator(mediatedItem, mapping)); + }); + + it("creating_mediator_gives_mediator_to_mediator_manager", () => { + const mediatedItem: createjs.Container = new createjs.Container(); + const mapping: IMediatorMapping = new MediatorMapping(createTypeFilter([createjs.Container]), CallbackMediator); + manager = new MediatorManager(factory, injector.get(IDisplayObjectObserverFactory)); + let managerMock = sinon.mock(manager); + managerMock.expects("addMediator").once(); + factory = new MediatorFactory(injector, manager); + factory.createMediators(mediatedItem, createjs.Container, [mapping]); + factory.createMediators(mediatedItem, createjs.Container, [mapping]); + managerMock.restore(); + managerMock.verify(); + }); + + it("removeMediator_removes_mediator_from_manager", () => { + const mediatedItem: createjs.Container = new createjs.Container(); + const mapping: IMediatorMapping = new MediatorMapping(createTypeFilter([createjs.Container]), CallbackMediator); + manager = new MediatorManager(factory, injector.get(IDisplayObjectObserverFactory)); + let managerMock = sinon.mock(manager); + managerMock.expects("removeMediator").once(); + factory = new MediatorFactory(injector, manager); + factory.createMediators(mediatedItem, createjs.Container, [mapping]); + factory.removeMediators(mediatedItem); + factory.removeMediators(mediatedItem); + managerMock.restore(); + managerMock.verify(); + }); + + it("removeAllMediators_removes_all_mediators_from_manager", () => { + const mediatedItem1: createjs.Container = new createjs.Container(); + const mediatedItem2: createjs.Container = new createjs.Container(); + const mapping1: IMediatorMapping = new MediatorMapping(createTypeFilter([createjs.Container]), CallbackMediator); + const mapping2: IMediatorMapping = new MediatorMapping(createTypeFilter([createjs.DisplayObject]), ViewInjectedAsRequestedMediator); + manager = new MediatorManager(factory, injector.get(IDisplayObjectObserverFactory)); + let managerMock = sinon.mock(manager); + managerMock.expects("removeMediator").exactly(4); + factory = new MediatorFactory(injector, manager); + factory.createMediators(mediatedItem1, createjs.Container, [mapping1, mapping2]); + factory.createMediators(mediatedItem2, createjs.Container, [mapping1, mapping2]); + factory.removeAllMediators(); + managerMock.restore(); + managerMock.verify(); + }); +}); diff --git a/test/createjs/robotlegs/bender/extensions/mediatorMap/impl/mediatorManager.test.ts b/test/createjs/robotlegs/bender/extensions/mediatorMap/impl/mediatorManager.test.ts new file mode 100644 index 0000000..0593418 --- /dev/null +++ b/test/createjs/robotlegs/bender/extensions/mediatorMap/impl/mediatorManager.test.ts @@ -0,0 +1,163 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import "../../../../../../entry"; + +import sinon = require("sinon"); + +import { assert } from "chai"; + +import { instantiateUnmapped, interfaces, IInjector, ITypeFilter, RobotlegsInjector, TypeMatcher } from "@robotlegsjs/core"; + +import { IDisplayObject } from "../../../../../../../src/robotlegs/bender/displayList/api/IDisplayObject"; +import { IDisplayObjectObserver } from "../../../../../../../src/robotlegs/bender/displayList/api/IDisplayObjectObserver"; +import { IDisplayObjectObserverFactory } from "../../../../../../../src/robotlegs/bender/displayList/api/IDisplayObjectObserverFactory"; + +import { IMediator } from "../../../../../../../src/robotlegs/bender/extensions/mediatorMap/api/IMediator"; +import { IMediatorMapping } from "../../../../../../../src/robotlegs/bender/extensions/mediatorMap/api/IMediatorMapping"; +import { MediatorFactory } from "../../../../../../../src/robotlegs/bender/extensions/mediatorMap/impl/MediatorFactory"; +import { MediatorMapping } from "../../../../../../../src/robotlegs/bender/extensions/mediatorMap/impl/MediatorMapping"; +import { MediatorManager } from "../../../../../../../src/robotlegs/bender/extensions/mediatorMap/impl/MediatorManager"; + +import { DisplayObjectObserver } from "../../../displayList/support/DisplayObjectObserver"; + +import { CallbackMediator } from "../support/CallbackMediator"; +import { EmptyMediator } from "../support/EmptyMediator"; +import { LifecycleReportingMediator } from "../support/LifecycleReportingMediator"; + +describe("MediatorManager", () => { + let injector: IInjector = null; + let factory: MediatorFactory = null; + let manager: MediatorManager = null; + let stage: createjs.Stage = null; + + beforeEach(() => { + injector = new RobotlegsInjector(); + injector.bind>(IDisplayObjectObserverFactory).toFactory(() => { + return (view: IDisplayObject, useCapture: boolean): IDisplayObjectObserver => { + return new DisplayObjectObserver(view, useCapture); + }; + }); + factory = new MediatorFactory(injector); + manager = (factory)._manager; + stage = new createjs.Stage("canvas"); + }); + + afterEach(() => { + injector = null; + factory = null; + manager = null; + stage = null; + }); + + function createTypeFilter(allOf: any[], anyOf: any[] = null, noneOf: any[] = null): ITypeFilter { + const matcher: TypeMatcher = new TypeMatcher(); + + if (allOf) { + matcher.allOf(allOf); + } + if (anyOf) { + matcher.anyOf(anyOf); + } + if (noneOf) { + matcher.noneOf(noneOf); + } + + return matcher.createTypeFilter(); + } + + it("mediator_is_removed_from_factory_when_view_leaves_stage", () => { + let factoryMock = sinon.mock(factory); + factoryMock.expects("removeMediators").once(); + + const view: createjs.Container = new createjs.Container(); + const mapping: IMediatorMapping = new MediatorMapping(createTypeFilter([createjs.Container]), CallbackMediator); + const mediator: IMediator = instantiateUnmapped(injector, CallbackMediator); + + stage.addChild(view); + manager.addMediator(mediator, view, mapping); + stage.removeChild(view); + + factoryMock.restore(); + factoryMock.verify(); + }); + + it("mediator_is_NOT_removed_when_view_leaves_stage_when_autoRemove_is_false", () => { + let factoryMock = sinon.mock(factory); + factoryMock.expects("removeMediators").never(); + + const view: createjs.Container = new createjs.Container(); + const mapping: MediatorMapping = new MediatorMapping(createTypeFilter([createjs.Container]), CallbackMediator); + mapping.autoRemove(false); + const mediator: IMediator = instantiateUnmapped(injector, CallbackMediator); + + stage.addChild(view); + manager.addMediator(mediator, view, mapping); + stage.removeChild(view); + + factoryMock.restore(); + factoryMock.verify(); + }); + + it("mediator_lifecycle_methods_are_invoked", () => { + const expected: string[] = ["preInitialize", "initialize", "postInitialize", "preDestroy", "destroy", "postDestroy"]; + const actual: string[] = []; + expected.forEach((phase: string) => { + injector + .bind("Function") + .toFunction((ph: string) => { + actual.push(ph); + }) + .whenTargetNamed(phase + "Callback"); + }); + const item: createjs.Container = new createjs.Container(); + const mediator: IMediator = instantiateUnmapped(injector, LifecycleReportingMediator); + const mapping: IMediatorMapping = new MediatorMapping(createTypeFilter([createjs.Container]), LifecycleReportingMediator); + manager.addMediator(mediator, item, mapping); + manager.removeMediator(mediator, item, mapping); + assert.deepEqual(actual, expected); + }); + + it("mediator_is_given_view", () => { + const view: createjs.Container = new createjs.Container(); + const mapping: IMediatorMapping = new MediatorMapping(createTypeFilter([createjs.Container]), LifecycleReportingMediator); + const mediator: LifecycleReportingMediator = instantiateUnmapped(injector, LifecycleReportingMediator); + manager.addMediator(mediator, view, mapping); + assert.equal(mediator.view, view); + }); + + it("empty_mediator_is_created", () => { + let managerMock = sinon.mock(manager); + managerMock.expects("initializeMediator").once(); + + const view: createjs.Container = new createjs.Container(); + const mapping: IMediatorMapping = new MediatorMapping(createTypeFilter([createjs.Container]), EmptyMediator); + + factory.createMediators(view, createjs.Container, [mapping]); + + managerMock.restore(); + managerMock.verify(); + }); + + it("empty_mediator_is_destroyed", () => { + let managerMock = sinon.mock(manager); + managerMock.expects("initializeMediator").once(); + managerMock.expects("destroyMediator").once(); + + const view: createjs.Container = new createjs.Container(); + + const mapping: IMediatorMapping = new MediatorMapping(createTypeFilter([createjs.Container]), EmptyMediator); + + factory.createMediators(view, createjs.Container, [mapping]); + + stage.addChild(view); + stage.removeChild(view); + + managerMock.restore(); + managerMock.verify(); + }); +}); diff --git a/test/createjs/robotlegs/bender/extensions/mediatorMap/impl/mediatorMap.test.ts b/test/createjs/robotlegs/bender/extensions/mediatorMap/impl/mediatorMap.test.ts new file mode 100644 index 0000000..787afe3 --- /dev/null +++ b/test/createjs/robotlegs/bender/extensions/mediatorMap/impl/mediatorMap.test.ts @@ -0,0 +1,101 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import "../../../../../../entry"; + +import { assert } from "chai"; + +import { interfaces, IContext, Context, TypeMatcher } from "@robotlegsjs/core"; + +import { IDisplayObject } from "../../../../../../../src/robotlegs/bender/displayList/api/IDisplayObject"; +import { IDisplayObjectObserver } from "../../../../../../../src/robotlegs/bender/displayList/api/IDisplayObjectObserver"; +import { IDisplayObjectObserverFactory } from "../../../../../../../src/robotlegs/bender/displayList/api/IDisplayObjectObserverFactory"; + +import { IMediatorMapper } from "../../../../../../../src/robotlegs/bender/extensions/mediatorMap/dsl/IMediatorMapper"; +import { MediatorMap } from "../../../../../../../src/robotlegs/bender/extensions/mediatorMap/impl/MediatorMap"; +import { MediatorMapper } from "../../../../../../../src/robotlegs/bender/extensions/mediatorMap/impl/MediatorMapper"; + +import { DisplayObjectObserver } from "../../../displayList/support/DisplayObjectObserver"; + +describe("MediatorMap", () => { + let context: IContext = null; + let mediatorMap: MediatorMap = null; + + beforeEach(() => { + context = new Context(); + context.injector + .bind>(IDisplayObjectObserverFactory) + .toFactory(() => { + return (view: IDisplayObject, useCapture: boolean): IDisplayObjectObserver => { + return new DisplayObjectObserver(view, useCapture); + }; + }); + mediatorMap = new MediatorMap(context); + }); + + afterEach(() => { + if (context.initialized) { + context.destroy(); + } + + context = null; + mediatorMap = null; + }); + + it("mapMatcher_creates_mapper", () => { + const matcher: TypeMatcher = new TypeMatcher().allOf(createjs.Container); + assert.instanceOf(mediatorMap.mapMatcher(matcher), MediatorMapper); + }); + + it("mapMatcher_to_matching_TypeMatcher_returns_same_mapper", () => { + const matcher1: TypeMatcher = new TypeMatcher().allOf(createjs.Container); + const matcher2: TypeMatcher = new TypeMatcher().allOf(createjs.Container); + const mapper1: IMediatorMapper = mediatorMap.mapMatcher(matcher1); + const mapper2: IMediatorMapper = mediatorMap.mapMatcher(matcher2); + assert.equal(mapper1, mapper2); + }); + + it("mapMatcher_to_differing_TypeMatcher_returns_different_mapper", () => { + const matcher1: TypeMatcher = new TypeMatcher().allOf(createjs.Container); + const matcher2: TypeMatcher = new TypeMatcher().allOf(createjs.DisplayObject); + const mapper1: IMediatorMapper = mediatorMap.mapMatcher(matcher1); + const mapper2: IMediatorMapper = mediatorMap.mapMatcher(matcher2); + assert.notEqual(mapper1, mapper2); + }); + + it("map_creates_mapper", () => { + assert.instanceOf(mediatorMap.map(createjs.Container), MediatorMapper); + }); + + it("map_to_matching_TypeMatcher_returns_same_mapper", () => { + const mapper1: IMediatorMapper = mediatorMap.map(createjs.Container); + const mapper2: IMediatorMapper = mediatorMap.map(createjs.Container); + assert.equal(mapper1, mapper2); + }); + + it("map_to_differing_TypeMatcher_returns_different_mapper", () => { + const mapper1: IMediatorMapper = mediatorMap.map(createjs.Container); + const mapper2: IMediatorMapper = mediatorMap.map(createjs.DisplayObject); + assert.notEqual(mapper1, mapper2); + }); + + it("unmapMatcher_returns_mapper", () => { + const mapper: MediatorMapper = mediatorMap.mapMatcher(new TypeMatcher().allOf(createjs.Container)); + const unmappedMapper: MediatorMapper = mediatorMap.unmapMatcher(new TypeMatcher().allOf(createjs.Container)); + assert.equal(unmappedMapper, mapper); + }); + + it("unmap_returns_mapper", () => { + const mapper: MediatorMapper = mediatorMap.map(createjs.Container); + const unmappedMapper: MediatorMapper = mediatorMap.unmap(createjs.Container); + assert.equal(unmappedMapper, mapper); + }); + + it("robust_to_unmapping_non_existent_mappings", () => { + mediatorMap.unmapMatcher(new TypeMatcher().allOf(createjs.Container)).fromAll(); + }); +}); diff --git a/test/createjs/robotlegs/bender/extensions/mediatorMap/impl/mediatorMapPreload.test.ts b/test/createjs/robotlegs/bender/extensions/mediatorMap/impl/mediatorMapPreload.test.ts new file mode 100644 index 0000000..f7dcfca --- /dev/null +++ b/test/createjs/robotlegs/bender/extensions/mediatorMap/impl/mediatorMapPreload.test.ts @@ -0,0 +1,277 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import "../../../../../../entry"; + +import { assert } from "chai"; + +import { interfaces, IInjector, IContext, Context, TypeMatcher } from "@robotlegsjs/core"; + +import { IDisplayObject } from "../../../../../../../src/robotlegs/bender/displayList/api/IDisplayObject"; +import { IDisplayObjectObserver } from "../../../../../../../src/robotlegs/bender/displayList/api/IDisplayObjectObserver"; +import { IDisplayObjectObserverFactory } from "../../../../../../../src/robotlegs/bender/displayList/api/IDisplayObjectObserverFactory"; + +import { MediatorMap } from "../../../../../../../src/robotlegs/bender/extensions/mediatorMap/impl/MediatorMap"; + +import { DisplayObjectObserver } from "../../../displayList/support/DisplayObjectObserver"; + +import { Alpha50PercentHook } from "../support/Alpha50PercentHook"; +import { ExampleMediator } from "../support/ExampleMediator"; +import { ExampleMediator2 } from "../support/ExampleMediator2"; +import { ExampleView } from "../support/ExampleView"; +import { HappyGuard } from "../support/HappyGuard"; +import { ExampleDisplayObjectMediator } from "../support/ExampleDisplayObjectMediator"; +import { HookWithMediatorAndViewInjectionReportFunction } from "../support/HookWithMediatorAndViewInjectionReportFunction"; +import { MediatorWatcher } from "../support/MediatorWatcher"; +import { NotAView } from "../support/NotAView"; +import { NotAViewMediator } from "../support/NotAViewMediator"; +import { OnlyIfViewHasChildrenGuard } from "../support/OnlyIfViewHasChildrenGuard"; +import { RectangleMediator } from "../support/RectangleMediator"; + +describe("MediatorMap", () => { + let context: IContext = null; + let injector: IInjector = null; + let mediatorMap: MediatorMap = null; + let mediatorWatcher: MediatorWatcher = null; + + beforeEach(() => { + context = new Context(); + injector = context.injector; + injector.bind>(IDisplayObjectObserverFactory).toFactory(() => { + return (view: IDisplayObject, useCapture: boolean): IDisplayObjectObserver => { + return new DisplayObjectObserver(view, useCapture); + }; + }); + mediatorMap = new MediatorMap(context); + mediatorWatcher = new MediatorWatcher(); + injector.bind(MediatorWatcher).toConstantValue(mediatorWatcher); + }); + + afterEach(() => { + if (context.initialized) { + context.destroy(); + } + + context = null; + injector = null; + mediatorMap = null; + mediatorWatcher = null; + }); + + it("can_be_instantiated", () => { + assert.instanceOf(mediatorMap, MediatorMap); + }); + + it("a_hook_runs_and_receives_injections_of_view_and_mediator", () => { + const expectedView: ExampleView = new ExampleView(); + const expectedViewWidth: number = 100; + const expectedViewHeight: number = 200; + + let actualView: ExampleView = null; + let actualViewWidth: number = 0; + let actualViewHeight: number = 0; + + mediatorMap + .map(ExampleView) + .toMediator(RectangleMediator) + .withHooks(HookWithMediatorAndViewInjectionReportFunction); + + injector + .bind(Number) + .toConstantValue(expectedViewWidth) + .whenTargetNamed("width"); + injector + .bind(Number) + .toConstantValue(expectedViewHeight) + .whenTargetNamed("height"); + + injector + .bind("Function") + .toFunction((view: ExampleView, width: number, height: number) => { + actualView = view; + actualViewWidth = width; + actualViewHeight = height; + }) + .whenTargetNamed("reportView"); + + mediatorMap.handleView(expectedView, ExampleView); + + assert.equal(actualView, expectedView); + assert.equal(actualViewWidth, expectedViewWidth); + assert.equal(actualViewHeight, expectedViewHeight); + }); + + it("create_mediator_instantiates_mediator_for_view_when_mapped", () => { + mediatorMap.map(ExampleView).toMediator(ExampleMediator); + + mediatorMap.handleView(new ExampleView(), ExampleView); + + const expectedNotifications: string[] = ["ExampleMediator"]; + + assert.deepEqual(expectedNotifications, mediatorWatcher.notifications); + }); + + it("doesnt_leave_view_and_mediator_mappings_lying_around", () => { + mediatorMap.mapMatcher(new TypeMatcher().anyOf(createjs.Container, ExampleView)).toMediator(ExampleMediator); + mediatorMap.handleView(new ExampleView(), ExampleView); + + assert.isFalse(injector.isBound(createjs.Container)); + assert.isFalse(injector.isBound(ExampleView)); + assert.isFalse(injector.isBound(ExampleMediator)); + }); + + it("handler_creates_mediator_for_view_mapped_by_matcher", () => { + mediatorMap.mapMatcher(new TypeMatcher().allOf(createjs.DisplayObject)).toMediator(ExampleDisplayObjectMediator); + + mediatorMap.handleView(new ExampleView(), ExampleView); + + const expectedNotifications: string[] = ["ExampleDisplayObjectMediator"]; + + assert.deepEqual(expectedNotifications, mediatorWatcher.notifications); + }); + + it("handler_doesnt_create_mediator_for_wrong_view_mapped_by_matcher", () => { + mediatorMap.mapMatcher(new TypeMatcher().allOf(createjs.Container)).toMediator(ExampleDisplayObjectMediator); + + mediatorMap.handleView(new createjs.DisplayObject(), null); + + const expectedNotifications: string[] = []; + + assert.deepEqual(expectedNotifications, mediatorWatcher.notifications); + }); + + it("mediate_instantiates_mediator_for_view_when_matched_to_mapping", () => { + mediatorMap.map(ExampleView).toMediator(ExampleMediator); + + mediatorMap.mediate(new ExampleView()); + + const expectedNotifications: string[] = ["ExampleMediator"]; + + assert.deepEqual(expectedNotifications, mediatorWatcher.notifications); + }); + + it("mediator_is_created_if_guard_allows_it", () => { + mediatorMap + .map(ExampleView) + .toMediator(ExampleMediator) + .withGuards(OnlyIfViewHasChildrenGuard); + const view: ExampleView = new ExampleView(); + view.addChild(new ExampleView()); + mediatorMap.mediate(view); + const expectedNotifications: string[] = ["ExampleMediator"]; + assert.deepEqual(expectedNotifications, mediatorWatcher.notifications); + }); + + it("no_mediator_is_created_if_guard_prevents_it", () => { + mediatorMap + .map(ExampleView) + .toMediator(ExampleMediator) + .withGuards(OnlyIfViewHasChildrenGuard); + const view: ExampleView = new ExampleView(); + mediatorMap.mediate(view); + const expectedNotifications: string[] = []; + assert.deepEqual(expectedNotifications, mediatorWatcher.notifications); + }); + + it("runs_destroy_on_created_mediator_when_unmediate_runs", () => { + mediatorMap.map(ExampleView).toMediator(ExampleMediator); + const view: ExampleView = new ExampleView(); + mediatorMap.mediate(view); + mediatorMap.unmediate(view); + const expectedNotifications: string[] = ["ExampleMediator", "ExampleMediator destroy"]; + assert.deepEqual(expectedNotifications, mediatorWatcher.notifications); + }); + + it("multiple_mappings_per_matcher_create_mediators", () => { + mediatorMap.map(ExampleView).toMediator(ExampleMediator); + mediatorMap.map(ExampleView).toMediator(ExampleMediator2); + mediatorMap.mediate(new ExampleView()); + const expectedNotifications: string[] = ["ExampleMediator", "ExampleMediator2"]; + assert.deepEqual(expectedNotifications, mediatorWatcher.notifications); + }); + + it("multiple_mappings_per_matcher_destroy_mediators", () => { + mediatorMap.map(ExampleView).toMediator(ExampleMediator); + mediatorMap.map(ExampleView).toMediator(ExampleMediator2); + + const view: ExampleView = new ExampleView(); + + mediatorMap.mediate(view); + mediatorMap.unmediate(view); + + const expectedNotifications: string[] = [ + "ExampleMediator", + "ExampleMediator2", + "ExampleMediator destroy", + "ExampleMediator2 destroy" + ]; + assert.deepEqual(expectedNotifications, mediatorWatcher.notifications); + }); + + it("only_one_mediator_created_if_identical_mapping_duplicated", () => { + mediatorMap + .map(ExampleView) + .toMediator(ExampleMediator) + .withGuards(HappyGuard) + .withHooks(Alpha50PercentHook); + mediatorMap + .map(ExampleView) + .toMediator(ExampleMediator) + .withGuards(HappyGuard) + .withHooks(Alpha50PercentHook); + + mediatorMap.mediate(new ExampleView()); + const expectedNotifications: string[] = ["ExampleMediator"]; + assert.deepEqual(expectedNotifications, mediatorWatcher.notifications); + }); + + it("removing_a_mapping_that_doesnt_exist_doesnt_throw_an_error", () => { + mediatorMap.unmap(ExampleView).fromMediator(ExampleMediator); + }); + + it("unmediateAll_removes_all_mediators", () => { + mediatorMap.map(ExampleView).toMediator(ExampleMediator); + mediatorMap.map(ExampleView).toMediator(ExampleMediator2); + + const view: ExampleView = new ExampleView(); + + mediatorMap.mediate(view); + mediatorMap.unmediateAll(); + + const expectedNotifications: string[] = [ + "ExampleMediator", + "ExampleMediator2", + "ExampleMediator destroy", + "ExampleMediator2 destroy" + ]; + assert.deepEqual(expectedNotifications, mediatorWatcher.notifications); + }); + + it("mediator_is_created_for_non_view_object", () => { + mediatorMap.map(NotAView).toMediator(NotAViewMediator); + const notAView: NotAView = new NotAView(); + mediatorMap.mediate(notAView); + const expectedNotifications: string[] = ["NotAViewMediator"]; + assert.deepEqual(expectedNotifications, mediatorWatcher.notifications); + }); + + it("non_view_object_injected_into_mediator_correctly", () => { + mediatorMap.map(NotAView).toMediator(NotAViewMediator); + const notAView: NotAView = new NotAView(); + mediatorMap.mediate(notAView); + assert.equal(notAView.mediatorName, "NotAViewMediator"); + }); + + it("mediator_is_destroyed_for_non_view_object", () => { + mediatorMap.map(NotAView).toMediator(NotAViewMediator); + const notAView: NotAView = new NotAView(); + mediatorMap.mediate(notAView); + mediatorMap.unmediate(notAView); + const expectedNotifications: string[] = ["NotAViewMediator", "NotAViewMediator destroy"]; + assert.deepEqual(expectedNotifications, mediatorWatcher.notifications); + }); +}); diff --git a/test/createjs/robotlegs/bender/extensions/mediatorMap/impl/mediatorMapper.test.ts b/test/createjs/robotlegs/bender/extensions/mediatorMap/impl/mediatorMapper.test.ts new file mode 100644 index 0000000..f763f37 --- /dev/null +++ b/test/createjs/robotlegs/bender/extensions/mediatorMap/impl/mediatorMapper.test.ts @@ -0,0 +1,186 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import "../../../../../../entry"; + +import sinon = require("sinon"); + +import { interfaces, IContext, IInjector, ILogger, Context, TypeMatcher } from "@robotlegsjs/core"; + +import { IDisplayObject } from "../../../../../../../src/robotlegs/bender/displayList/api/IDisplayObject"; +import { IDisplayObjectObserver } from "../../../../../../../src/robotlegs/bender/displayList/api/IDisplayObjectObserver"; +import { IDisplayObjectObserverFactory } from "../../../../../../../src/robotlegs/bender/displayList/api/IDisplayObjectObserverFactory"; + +import { MediatorFactory } from "../../../../../../../src/robotlegs/bender/extensions/mediatorMap/impl/MediatorFactory"; +import { MediatorMapper } from "../../../../../../../src/robotlegs/bender/extensions/mediatorMap/impl/MediatorMapper"; +import { MediatorViewHandler } from "../../../../../../../src/robotlegs/bender/extensions/mediatorMap/impl/MediatorViewHandler"; + +import { DisplayObjectObserver } from "../../../displayList/support/DisplayObjectObserver"; + +import { NullMediator } from "../support/NullMediator"; +import { NullMediator2 } from "../support/NullMediator2"; + +describe("MediatorMapper", () => { + let context: IContext = null; + let injector: IInjector = null; + let logger: ILogger = null; + let factory: MediatorFactory = null; + let handler: MediatorViewHandler = null; + let mapper: MediatorMapper = null; + + beforeEach(() => { + const matcher: TypeMatcher = new TypeMatcher().allOf(createjs.Container); + + context = new Context(); + injector = context.injector; + injector.bind>(IDisplayObjectObserverFactory).toFactory(() => { + return (view: IDisplayObject, useCapture: boolean): IDisplayObjectObserver => { + return new DisplayObjectObserver(view, useCapture); + }; + }); + factory = new MediatorFactory(injector); + handler = new MediatorViewHandler(factory); + matcher.createTypeFilter(); + mapper = new MediatorMapper(matcher.createTypeFilter(), handler); + context.initialize(); + }); + + afterEach(() => { + if (context.initialized) { + context.destroy(); + } + + context = null; + injector = null; + logger = null; + factory = null; + handler = null; + mapper = null; + }); + + it("toMediator_registers_mappingConfig_with_handler", () => { + let handlerMock = sinon.mock(handler); + handlerMock.expects("addMapping").once(); + + mapper.toMediator(NullMediator); + + handlerMock.restore(); + handlerMock.verify(); + }); + + it("fromMediator_unregisters_mappingConfig_from_handler", () => { + let handlerMock = sinon.mock(handler); + handlerMock.expects("addMapping").once(); + handlerMock.expects("removeMapping").once(); + + mapper.toMediator(NullMediator); + mapper.fromMediator(NullMediator); + + handlerMock.restore(); + handlerMock.verify(); + }); + + it("fromMediator_removes_only_specified_mappingConfig_from_handler", () => { + let handlerMock = sinon.mock(handler); + handlerMock.expects("addMapping").twice(); + handlerMock.expects("removeMapping").once(); + + mapper.toMediator(NullMediator); + mapper.toMediator(NullMediator2); + mapper.fromMediator(NullMediator); + + handlerMock.restore(); + handlerMock.verify(); + }); + + it("fromAll_removes_all_mappingConfigs_from_handler", () => { + let handlerMock = sinon.mock(handler); + handlerMock.expects("addMapping").twice(); + handlerMock.expects("removeMapping").twice(); + + mapper.toMediator(NullMediator); + mapper.toMediator(NullMediator2); + mapper.fromAll(); + + handlerMock.restore(); + handlerMock.verify(); + }); + + it("toMediator_unregisters_old_mappingConfig_and_registers_new_one_when_overwritten", () => { + let handlerMock = sinon.mock(handler); + handlerMock.expects("addMapping").twice(); + handlerMock.expects("removeMapping").once(); + + mapper.toMediator(NullMediator); + mapper.toMediator(NullMediator); + + handlerMock.restore(); + handlerMock.verify(); + }); + + it("toMediator_logs_debug_when_creating_mapping", () => { + const matcher: TypeMatcher = new TypeMatcher().allOf(createjs.Container); + logger = context.getLogger(context); + mapper = new MediatorMapper(matcher.createTypeFilter(), handler, logger); + + let loggerMock = sinon.mock(logger); + loggerMock.expects("debug").once(); + + mapper.toMediator(NullMediator); + + loggerMock.restore(); + loggerMock.verify(); + }); + + it("toMediator_warns_when_overwritten", () => { + const matcher: TypeMatcher = new TypeMatcher().allOf(createjs.Container); + logger = context.getLogger(context); + mapper = new MediatorMapper(matcher.createTypeFilter(), handler, logger); + + let loggerMock = sinon.mock(logger); + loggerMock.expects("warn").once(); + + mapper.toMediator(NullMediator); + mapper.toMediator(NullMediator); + + loggerMock.restore(); + loggerMock.verify(); + }); + + it("fromMediator_logs_debug_when_removing_mapping", () => { + const matcher: TypeMatcher = new TypeMatcher().allOf(createjs.Container); + logger = context.getLogger(context); + mapper = new MediatorMapper(matcher.createTypeFilter(), handler, logger); + + let loggerMock = sinon.mock(logger); + loggerMock.expects("debug").twice(); + + mapper.toMediator(NullMediator); + mapper.fromMediator(NullMediator); + + loggerMock.restore(); + loggerMock.verify(); + }); + + it("fromMediator_does_nothing_when_mediator_is_not_mapped", () => { + const matcher: TypeMatcher = new TypeMatcher().allOf(createjs.Container); + logger = context.getLogger(context); + mapper = new MediatorMapper(matcher.createTypeFilter(), handler, logger); + + let loggerMock = sinon.mock(logger); + loggerMock.expects("debug").never(); + loggerMock.expects("info").never(); + loggerMock.expects("warn").never(); + loggerMock.expects("error").never(); + loggerMock.expects("fatal").never(); + + mapper.fromMediator(NullMediator); + + loggerMock.restore(); + loggerMock.verify(); + }); +}); diff --git a/test/createjs/robotlegs/bender/extensions/mediatorMap/impl/mediatorViewHandler.test.ts b/test/createjs/robotlegs/bender/extensions/mediatorMap/impl/mediatorViewHandler.test.ts new file mode 100644 index 0000000..931d3e0 --- /dev/null +++ b/test/createjs/robotlegs/bender/extensions/mediatorMap/impl/mediatorViewHandler.test.ts @@ -0,0 +1,213 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import "../../../../../../entry"; + +import { assert } from "chai"; + +import { interfaces, IContext, IInjector, ITypeFilter, Context, TypeMatcher } from "@robotlegsjs/core"; + +import { IDisplayObject } from "../../../../../../../src/robotlegs/bender/displayList/api/IDisplayObject"; +import { IDisplayObjectObserver } from "../../../../../../../src/robotlegs/bender/displayList/api/IDisplayObjectObserver"; +import { IDisplayObjectObserverFactory } from "../../../../../../../src/robotlegs/bender/displayList/api/IDisplayObjectObserverFactory"; + +import { MediatorFactory } from "../../../../../../../src/robotlegs/bender/extensions/mediatorMap/impl/MediatorFactory"; +import { MediatorMapping } from "../../../../../../../src/robotlegs/bender/extensions/mediatorMap/impl/MediatorMapping"; +import { MediatorViewHandler } from "../../../../../../../src/robotlegs/bender/extensions/mediatorMap/impl/MediatorViewHandler"; + +import { DisplayObjectObserver } from "../../../displayList/support/DisplayObjectObserver"; + +import { CallbackMediator } from "../support/CallbackMediator"; +import { NotAView } from "../support/NotAView"; + +describe("MediatorViewHandler", () => { + let context: IContext = null; + let injector: IInjector = null; + let factory: MediatorFactory = null; + let handler: MediatorViewHandler = null; + + beforeEach(() => { + context = new Context(); + injector = context.injector; + injector.bind>(IDisplayObjectObserverFactory).toFactory(() => { + return (view: IDisplayObject, useCapture: boolean): IDisplayObjectObserver => { + return new DisplayObjectObserver(view, useCapture); + }; + }); + factory = new MediatorFactory(injector); + handler = new MediatorViewHandler(factory); + context.initialize(); + }); + + afterEach(() => { + if (context.initialized) { + context.destroy(); + } + + context = null; + injector = null; + factory = null; + handler = null; + }); + + function createTypeFilter(allOf: any[], anyOf: any[] = null, noneOf: any[] = null): ITypeFilter { + const matcher: TypeMatcher = new TypeMatcher(); + + if (allOf) { + matcher.allOf(allOf); + } + if (anyOf) { + matcher.anyOf(anyOf); + } + if (noneOf) { + matcher.noneOf(noneOf); + } + + return matcher.createTypeFilter(); + } + + it("view_is_handled", () => { + let createdMediator: any = null; + injector + .bind("Function") + .toFunction((mediator: any) => { + createdMediator = mediator; + }) + .whenTargetNamed("executeCallback"); + const mapping: MediatorMapping = new MediatorMapping(createTypeFilter([createjs.Container]), CallbackMediator); + handler.addMapping(mapping); + handler.handleView(new createjs.Container(), createjs.Container); + assert.isNotNull(createdMediator); + assert.instanceOf(createdMediator, CallbackMediator); + }); + + it("view_is_not_handled", () => { + let createdMediator: any = null; + injector + .bind("Function") + .toFunction((mediator: any) => { + createdMediator = mediator; + }) + .whenTargetNamed("executeCallback"); + const mapping: MediatorMapping = new MediatorMapping(createTypeFilter([createjs.Sprite]), CallbackMediator); + handler.addMapping(mapping); + handler.handleView(new createjs.Container(), createjs.Container); + assert.isNull(createdMediator); + }); + + it("addMapping_called_twice_have_no_effect", () => { + let createdMediators: any[] = []; + injector + .bind("Function") + .toFunction((mediator: any) => { + createdMediators.push(mediator); + }) + .whenTargetNamed("executeCallback"); + const mapping: MediatorMapping = new MediatorMapping(createTypeFilter([createjs.Container]), CallbackMediator); + handler.addMapping(mapping); + handler.addMapping(mapping); + handler.handleView(new createjs.Container(), createjs.Container); + assert.equal(createdMediators.length, 1); + }); + + it("removeMapping_removes_mapping_and_mediators_are_not_created", () => { + let createdMediators: any[] = []; + injector + .bind("Function") + .toFunction((mediator: any) => { + createdMediators.push(mediator); + }) + .whenTargetNamed("executeCallback"); + const mapping: MediatorMapping = new MediatorMapping(createTypeFilter([createjs.Container]), CallbackMediator); + handler.addMapping(mapping); + handler.removeMapping(mapping); + handler.handleView(new createjs.Container(), createjs.Container); + assert.equal(createdMediators.length, 0); + }); + + it("removeMapping_called_twice_have_no_effect", () => { + let createdMediators: any[] = []; + injector + .bind("Function") + .toFunction((mediator: any) => { + createdMediators.push(mediator); + }) + .whenTargetNamed("executeCallback"); + const mapping: MediatorMapping = new MediatorMapping(createTypeFilter([createjs.Container]), CallbackMediator); + handler.addMapping(mapping); + handler.removeMapping(mapping); + handler.removeMapping(mapping); + handler.handleView(new createjs.Container(), createjs.Container); + assert.equal(createdMediators.length, 0); + }); + + it("handleItem_handles_not_view_elements", () => { + let createdMediators: any[] = []; + injector + .bind("Function") + .toFunction((mediator: any) => { + createdMediators.push(mediator); + }) + .whenTargetNamed("executeCallback"); + const mapping: MediatorMapping = new MediatorMapping(createTypeFilter([NotAView]), CallbackMediator); + handler.addMapping(mapping); + handler.handleItem(new NotAView(), NotAView); + assert.equal(createdMediators.length, 1); + }); + + it("handleItem_do_nothing_when_item_have_any_mapping", () => { + let createdMediators: any[] = []; + injector + .bind("Function") + .toFunction((mediator: any) => { + createdMediators.push(mediator); + }) + .whenTargetNamed("executeCallback"); + const mapping: MediatorMapping = new MediatorMapping(createTypeFilter([NotAView]), CallbackMediator); + handler.addMapping(mapping); + handler.handleItem(new createjs.Container(), createjs.Container); + assert.equal(createdMediators.length, 0); + }); + + it("handleItem_called_twice_for_same_type_returns_earlier", () => { + let createdMediators: any[] = []; + injector + .bind("Function") + .toFunction((mediator: any) => { + createdMediators.push(mediator); + }) + .whenTargetNamed("executeCallback"); + const mapping1: MediatorMapping = new MediatorMapping(createTypeFilter([createjs.Container]), CallbackMediator); + handler.addMapping(mapping1); + const mapping2: MediatorMapping = new MediatorMapping(createTypeFilter([createjs.DisplayObject]), CallbackMediator); + handler.addMapping(mapping2); + + handler.handleItem(new NotAView(), NotAView); + handler.handleItem(new NotAView(), NotAView); + + assert.equal(createdMediators.length, 0); + }); + + it("handleView_called_twice_for_same_type_returns_all_mediators", () => { + let createdMediators: any[] = []; + injector + .bind("Function") + .toFunction((mediator: any) => { + createdMediators.push(mediator); + }) + .whenTargetNamed("executeCallback"); + const mapping1: MediatorMapping = new MediatorMapping(createTypeFilter([createjs.Container]), CallbackMediator); + handler.addMapping(mapping1); + const mapping2: MediatorMapping = new MediatorMapping(createTypeFilter([createjs.DisplayObject]), CallbackMediator); + handler.addMapping(mapping2); + + handler.handleView(new createjs.Container(), createjs.Container); + handler.handleView(new createjs.Container(), createjs.Container); + + assert.equal(createdMediators.length, 4); + }); +}); diff --git a/test/createjs/robotlegs/bender/extensions/mediatorMap/mediatorMapExtension.test.ts b/test/createjs/robotlegs/bender/extensions/mediatorMap/mediatorMapExtension.test.ts new file mode 100644 index 0000000..0cd0442 --- /dev/null +++ b/test/createjs/robotlegs/bender/extensions/mediatorMap/mediatorMapExtension.test.ts @@ -0,0 +1,97 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import "../../../../../entry"; + +import { assert } from "chai"; + +import { interfaces, IContext, Context } from "@robotlegsjs/core"; + +import { IDisplayObject } from "../../../../../../src/robotlegs/bender/displayList/api/IDisplayObject"; +import { IDisplayObjectObserver } from "../../../../../../src/robotlegs/bender/displayList/api/IDisplayObjectObserver"; +import { IDisplayObjectObserverFactory } from "../../../../../../src/robotlegs/bender/displayList/api/IDisplayObjectObserverFactory"; + +import { IMediatorMap } from "../../../../../../src/robotlegs/bender/extensions/mediatorMap/api/IMediatorMap"; +import { MediatorMap } from "../../../../../../src/robotlegs/bender/extensions/mediatorMap/impl/MediatorMap"; +import { MediatorMapExtension } from "../../../../../../src/robotlegs/bender/extensions/mediatorMap/MediatorMapExtension"; + +import { ViewManagerExtension } from "../../../../../../src/robotlegs/bender/extensions/viewManager/ViewManagerExtension"; + +import { DisplayObjectObserver } from "../../displayList/support/DisplayObjectObserver"; + +describe("MediatorMapExtension", () => { + let context: IContext; + + beforeEach(() => { + context = new Context(); + }); + + afterEach(() => { + context.destroy(); + context = null; + }); + + it("installing_after_initialization_throws_error", () => { + function installExtensionAfterInitialization(): void { + context.initialize(); + context.install(MediatorMapExtension); + } + assert.throws(installExtensionAfterInitialization, Error); + }); + + it("mediatorMap_is_mapped_into_injector_on_initialize", () => { + let mediatorMap: IMediatorMap = null; + context.injector + .bind>(IDisplayObjectObserverFactory) + .toFactory(() => { + return (view: IDisplayObject, useCapture: boolean): IDisplayObjectObserver => { + return new DisplayObjectObserver(view, useCapture); + }; + }); + context.install(ViewManagerExtension, MediatorMapExtension); + context.whenInitializing(function(): void { + mediatorMap = context.injector.get(IMediatorMap); + }); + context.initialize(); + assert.isNotNull(mediatorMap); + assert.instanceOf(mediatorMap, MediatorMap); + }); + + it("mediatorMap_is_mapped_into_injector_on_initialize_when_view_manager_is_not_installed", () => { + let mediatorMap: IMediatorMap = null; + context.injector + .bind>(IDisplayObjectObserverFactory) + .toFactory(() => { + return (view: IDisplayObject, useCapture: boolean): IDisplayObjectObserver => { + return new DisplayObjectObserver(view, useCapture); + }; + }); + context.install(MediatorMapExtension); + context.whenInitializing(function(): void { + mediatorMap = context.injector.get(IMediatorMap); + }); + context.initialize(); + assert.isNotNull(mediatorMap); + assert.instanceOf(mediatorMap, MediatorMap); + }); + + it("mediatorMap_is_unmapped_from_injector_on_destroy", () => { + context.injector + .bind>(IDisplayObjectObserverFactory) + .toFactory(() => { + return (view: IDisplayObject, useCapture: boolean): IDisplayObjectObserver => { + return new DisplayObjectObserver(view, useCapture); + }; + }); + context.install(ViewManagerExtension, MediatorMapExtension); + context.afterDestroying(function(): void { + assert.isFalse(context.injector.isBound(IMediatorMap)); + }); + context.initialize(); + context.destroy(); + }); +}); diff --git a/test/createjs/robotlegs/bender/extensions/mediatorMap/support/Alpha50PercentHook.ts b/test/createjs/robotlegs/bender/extensions/mediatorMap/support/Alpha50PercentHook.ts new file mode 100644 index 0000000..801bdb9 --- /dev/null +++ b/test/createjs/robotlegs/bender/extensions/mediatorMap/support/Alpha50PercentHook.ts @@ -0,0 +1,20 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import { injectable, inject, IHook } from "@robotlegsjs/core"; + +import { ExampleView } from "./ExampleView"; + +@injectable() +export class Alpha50PercentHook implements IHook { + @inject(ExampleView) + public view: ExampleView; + + public hook(): void { + this.view.alpha = 0.5; + } +} diff --git a/test/createjs/robotlegs/bender/extensions/mediatorMap/support/CallbackHook.ts b/test/createjs/robotlegs/bender/extensions/mediatorMap/support/CallbackHook.ts new file mode 100644 index 0000000..c700614 --- /dev/null +++ b/test/createjs/robotlegs/bender/extensions/mediatorMap/support/CallbackHook.ts @@ -0,0 +1,27 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import { injectable, inject, named, IHook } from "@robotlegsjs/core"; + +@injectable() +export class CallbackHook implements IHook { + private _callback: Function; + + constructor( + @inject("Function") + @named("hookCallback") + callback: Function + ) { + this._callback = callback; + } + + public hook(): void { + if (this._callback) { + this._callback(); + } + } +} diff --git a/test/createjs/robotlegs/bender/extensions/mediatorMap/support/CallbackMediator.ts b/test/createjs/robotlegs/bender/extensions/mediatorMap/support/CallbackMediator.ts new file mode 100644 index 0000000..03116f2 --- /dev/null +++ b/test/createjs/robotlegs/bender/extensions/mediatorMap/support/CallbackMediator.ts @@ -0,0 +1,24 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import { injectable, inject, named, optional } from "@robotlegsjs/core"; + +@injectable() +export class CallbackMediator { + @inject("Function") + @named("executeCallback") + @optional() + public callback: Function; + + public initialize(): void { + if (this.callback) { + this.callback(this); + } + } + + public destroy(): void {} +} diff --git a/test/createjs/robotlegs/bender/extensions/mediatorMap/support/EmptyMediator.ts b/test/createjs/robotlegs/bender/extensions/mediatorMap/support/EmptyMediator.ts new file mode 100644 index 0000000..bdb95fb --- /dev/null +++ b/test/createjs/robotlegs/bender/extensions/mediatorMap/support/EmptyMediator.ts @@ -0,0 +1,11 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import { injectable } from "@robotlegsjs/core"; + +@injectable() +export class EmptyMediator {} diff --git a/test/createjs/robotlegs/bender/extensions/mediatorMap/support/ExampleDisplayObjectMediator.ts b/test/createjs/robotlegs/bender/extensions/mediatorMap/support/ExampleDisplayObjectMediator.ts new file mode 100644 index 0000000..ecefd9f --- /dev/null +++ b/test/createjs/robotlegs/bender/extensions/mediatorMap/support/ExampleDisplayObjectMediator.ts @@ -0,0 +1,23 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import { injectable, inject } from "@robotlegsjs/core"; + +import { MediatorWatcher } from "./MediatorWatcher"; + +@injectable() +export class ExampleDisplayObjectMediator { + @inject(MediatorWatcher) + public mediatorWatcher: MediatorWatcher; + + @inject(createjs.DisplayObject) + public view: createjs.DisplayObject; + + public initialize(): void { + this.mediatorWatcher.notify("ExampleDisplayObjectMediator"); + } +} diff --git a/test/createjs/robotlegs/bender/extensions/mediatorMap/support/ExampleMediator.ts b/test/createjs/robotlegs/bender/extensions/mediatorMap/support/ExampleMediator.ts new file mode 100644 index 0000000..48beb21 --- /dev/null +++ b/test/createjs/robotlegs/bender/extensions/mediatorMap/support/ExampleMediator.ts @@ -0,0 +1,28 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import { injectable, inject } from "@robotlegsjs/core"; + +import { ExampleView } from "./ExampleView"; +import { MediatorWatcher } from "./MediatorWatcher"; + +@injectable() +export class ExampleMediator { + @inject(MediatorWatcher) + public mediatorWatcher: MediatorWatcher; + + @inject(ExampleView) + public view: ExampleView; + + public initialize(): void { + this.mediatorWatcher.notify("ExampleMediator"); + } + + public destroy(): void { + this.mediatorWatcher.notify("ExampleMediator destroy"); + } +} diff --git a/test/createjs/robotlegs/bender/extensions/mediatorMap/support/ExampleMediator2.ts b/test/createjs/robotlegs/bender/extensions/mediatorMap/support/ExampleMediator2.ts new file mode 100644 index 0000000..a0bdeb3 --- /dev/null +++ b/test/createjs/robotlegs/bender/extensions/mediatorMap/support/ExampleMediator2.ts @@ -0,0 +1,28 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import { injectable, inject } from "@robotlegsjs/core"; + +import { MediatorWatcher } from "./MediatorWatcher"; +import { ExampleView } from "./ExampleView"; + +@injectable() +export class ExampleMediator2 { + @inject(MediatorWatcher) + public mediatorWatcher: MediatorWatcher; + + @inject(ExampleView) + public view: ExampleView; + + public initialize(): void { + this.mediatorWatcher.notify("ExampleMediator2"); + } + + public destroy(): void { + this.mediatorWatcher.notify("ExampleMediator2 destroy"); + } +} diff --git a/test/createjs/robotlegs/bender/extensions/mediatorMap/support/ExampleView.ts b/test/createjs/robotlegs/bender/extensions/mediatorMap/support/ExampleView.ts new file mode 100644 index 0000000..88beed5 --- /dev/null +++ b/test/createjs/robotlegs/bender/extensions/mediatorMap/support/ExampleView.ts @@ -0,0 +1,8 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +export class ExampleView extends createjs.Container {} diff --git a/test/createjs/robotlegs/bender/extensions/mediatorMap/support/GrumpyGuard.ts b/test/createjs/robotlegs/bender/extensions/mediatorMap/support/GrumpyGuard.ts new file mode 100644 index 0000000..cf5e202 --- /dev/null +++ b/test/createjs/robotlegs/bender/extensions/mediatorMap/support/GrumpyGuard.ts @@ -0,0 +1,15 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import { injectable, IGuard } from "@robotlegsjs/core"; + +@injectable() +export class GrumpyGuard implements IGuard { + public approve(): boolean { + return false; + } +} diff --git a/test/createjs/robotlegs/bender/extensions/mediatorMap/support/HappyGuard.ts b/test/createjs/robotlegs/bender/extensions/mediatorMap/support/HappyGuard.ts new file mode 100644 index 0000000..d0ef698 --- /dev/null +++ b/test/createjs/robotlegs/bender/extensions/mediatorMap/support/HappyGuard.ts @@ -0,0 +1,15 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import { injectable, IGuard } from "@robotlegsjs/core"; + +@injectable() +export class HappyGuard implements IGuard { + public approve(): boolean { + return true; + } +} diff --git a/test/createjs/robotlegs/bender/extensions/mediatorMap/support/HookWithMediatorAndViewInjectionReportFunction.ts b/test/createjs/robotlegs/bender/extensions/mediatorMap/support/HookWithMediatorAndViewInjectionReportFunction.ts new file mode 100644 index 0000000..6e83d23 --- /dev/null +++ b/test/createjs/robotlegs/bender/extensions/mediatorMap/support/HookWithMediatorAndViewInjectionReportFunction.ts @@ -0,0 +1,28 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import { injectable, inject, named, IHook } from "@robotlegsjs/core"; + +import { RectangleMediator } from "./RectangleMediator"; +import { ExampleView } from "./ExampleView"; + +@injectable() +export class HookWithMediatorAndViewInjectionReportFunction implements IHook { + @inject(RectangleMediator) + public mediator: RectangleMediator; + + @inject(ExampleView) + public view: ExampleView; + + @inject("Function") + @named("reportView") + public reportView: Function; + + public hook(): void { + this.reportView(this.view, this.mediator.width, this.mediator.height); + } +} diff --git a/test/createjs/robotlegs/bender/extensions/mediatorMap/support/InjectedMediator.ts b/test/createjs/robotlegs/bender/extensions/mediatorMap/support/InjectedMediator.ts new file mode 100644 index 0000000..f59a69b --- /dev/null +++ b/test/createjs/robotlegs/bender/extensions/mediatorMap/support/InjectedMediator.ts @@ -0,0 +1,18 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import { injectable, inject } from "@robotlegsjs/core"; + +@injectable() +export class InjectedMediator { + @inject(Number) + public number: number; + + public initialize(): void {} + + public destroy(): void {} +} diff --git a/test/createjs/robotlegs/bender/extensions/mediatorMap/support/LifecycleReportingMediator.ts b/test/createjs/robotlegs/bender/extensions/mediatorMap/support/LifecycleReportingMediator.ts new file mode 100644 index 0000000..e3f57a5 --- /dev/null +++ b/test/createjs/robotlegs/bender/extensions/mediatorMap/support/LifecycleReportingMediator.ts @@ -0,0 +1,89 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import { injectable, inject, named, optional } from "@robotlegsjs/core"; + +@injectable() +export class LifecycleReportingMediator { + @inject("Function") + @named("preInitializeCallback") + @optional() + public preInitializeCallback: Function; + + @inject("Function") + @named("initializeCallback") + @optional() + public initializeCallback: Function; + + @inject("Function") + @named("postInitializeCallback") + @optional() + public postInitializeCallback: Function; + + @inject("Function") + @named("preDestroyCallback") + @optional() + public preDestroyCallback: Function; + + @inject("Function") + @named("destroyCallback") + @optional() + public destroyCallback: Function; + + @inject("Function") + @named("postDestroyCallback") + @optional() + public postDestroyCallback: Function; + + public initialized: Boolean = false; + + public destroyed: Boolean = false; + + public view: any = undefined; + + /*============================================================================*/ + /* Public Functions */ + /*============================================================================*/ + + public preInitialize(): void { + if (this.preInitializeCallback) { + this.preInitializeCallback("preInitialize"); + } + } + + public initialize(): void { + this.initialized = true; + if (this.initializeCallback) { + this.initializeCallback("initialize"); + } + } + + public postInitialize(): void { + if (this.postInitializeCallback) { + this.postInitializeCallback("postInitialize"); + } + } + + public preDestroy(): void { + if (this.preDestroyCallback) { + this.preDestroyCallback("preDestroy"); + } + } + + public destroy(): void { + this.destroyed = true; + if (this.destroyCallback) { + this.destroyCallback("destroy"); + } + } + + public postDestroy(): void { + if (this.postDestroyCallback) { + this.postDestroyCallback("postDestroy"); + } + } +} diff --git a/test/createjs/robotlegs/bender/extensions/mediatorMap/support/MediatorHook.ts b/test/createjs/robotlegs/bender/extensions/mediatorMap/support/MediatorHook.ts new file mode 100644 index 0000000..2b08997 --- /dev/null +++ b/test/createjs/robotlegs/bender/extensions/mediatorMap/support/MediatorHook.ts @@ -0,0 +1,30 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import { injectable, inject, named, optional, IHook } from "@robotlegsjs/core"; + +import { ViewInjectedMediator } from "./ViewInjectedMediator"; + +@injectable() +export class MediatorHook implements IHook { + @inject("Function") + @named("callback") + @optional() + public callback: Function; + + @inject(createjs.Container) + public mediatedItem: createjs.Container; + + @inject(ViewInjectedMediator) + public mediator: ViewInjectedMediator; + + public hook(): void { + if (this.callback) { + this.callback(this); + } + } +} diff --git a/test/createjs/robotlegs/bender/extensions/mediatorMap/support/MediatorWatcher.ts b/test/createjs/robotlegs/bender/extensions/mediatorMap/support/MediatorWatcher.ts new file mode 100644 index 0000000..2033ce2 --- /dev/null +++ b/test/createjs/robotlegs/bender/extensions/mediatorMap/support/MediatorWatcher.ts @@ -0,0 +1,21 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import { injectable } from "@robotlegsjs/core"; + +@injectable() +export class MediatorWatcher { + protected _notifications: string[] = []; + + public get notifications(): string[] { + return this._notifications; + } + + public notify(message: string): void { + this._notifications.push(message); + } +} diff --git a/test/createjs/robotlegs/bender/extensions/mediatorMap/support/NotAView.ts b/test/createjs/robotlegs/bender/extensions/mediatorMap/support/NotAView.ts new file mode 100644 index 0000000..fe2174c --- /dev/null +++ b/test/createjs/robotlegs/bender/extensions/mediatorMap/support/NotAView.ts @@ -0,0 +1,13 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import { injectable } from "@robotlegsjs/core"; + +@injectable() +export class NotAView { + public mediatorName: string; +} diff --git a/test/createjs/robotlegs/bender/extensions/mediatorMap/support/NotAViewMediator.ts b/test/createjs/robotlegs/bender/extensions/mediatorMap/support/NotAViewMediator.ts new file mode 100644 index 0000000..3867473 --- /dev/null +++ b/test/createjs/robotlegs/bender/extensions/mediatorMap/support/NotAViewMediator.ts @@ -0,0 +1,29 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import { injectable, inject } from "@robotlegsjs/core"; + +import { MediatorWatcher } from "./MediatorWatcher"; +import { NotAView } from "./NotAView"; + +@injectable() +export class NotAViewMediator { + @inject(MediatorWatcher) + public mediatorWatcher: MediatorWatcher; + + @inject(NotAView) + public view: NotAView; + + public initialize(): void { + this.view.mediatorName = "NotAViewMediator"; + this.mediatorWatcher.notify("NotAViewMediator"); + } + + public destroy(): void { + this.mediatorWatcher.notify("NotAViewMediator destroy"); + } +} diff --git a/test/createjs/robotlegs/bender/extensions/mediatorMap/support/NullMediator.ts b/test/createjs/robotlegs/bender/extensions/mediatorMap/support/NullMediator.ts new file mode 100644 index 0000000..3d7cd80 --- /dev/null +++ b/test/createjs/robotlegs/bender/extensions/mediatorMap/support/NullMediator.ts @@ -0,0 +1,11 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import { injectable } from "@robotlegsjs/core"; + +@injectable() +export class NullMediator {} diff --git a/test/createjs/robotlegs/bender/extensions/mediatorMap/support/NullMediator2.ts b/test/createjs/robotlegs/bender/extensions/mediatorMap/support/NullMediator2.ts new file mode 100644 index 0000000..5e10f5f --- /dev/null +++ b/test/createjs/robotlegs/bender/extensions/mediatorMap/support/NullMediator2.ts @@ -0,0 +1,11 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import { injectable } from "@robotlegsjs/core"; + +@injectable() +export class NullMediator2 {} diff --git a/test/createjs/robotlegs/bender/extensions/mediatorMap/support/OnlyIfViewHasChildrenGuard.ts b/test/createjs/robotlegs/bender/extensions/mediatorMap/support/OnlyIfViewHasChildrenGuard.ts new file mode 100644 index 0000000..d40a6c7 --- /dev/null +++ b/test/createjs/robotlegs/bender/extensions/mediatorMap/support/OnlyIfViewHasChildrenGuard.ts @@ -0,0 +1,20 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import { injectable, inject, IGuard } from "@robotlegsjs/core"; + +import { ExampleView } from "./ExampleView"; + +@injectable() +export class OnlyIfViewHasChildrenGuard implements IGuard { + @inject(ExampleView) + public view: ExampleView; + + public approve(): boolean { + return this.view.children.length > 0; + } +} diff --git a/test/createjs/robotlegs/bender/extensions/mediatorMap/support/RectangleMediator.ts b/test/createjs/robotlegs/bender/extensions/mediatorMap/support/RectangleMediator.ts new file mode 100644 index 0000000..951069b --- /dev/null +++ b/test/createjs/robotlegs/bender/extensions/mediatorMap/support/RectangleMediator.ts @@ -0,0 +1,19 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import { injectable, inject, named } from "@robotlegsjs/core"; + +@injectable() +export class RectangleMediator { + @inject(Number) + @named("width") + public width: number; + + @inject(Number) + @named("height") + public height: number; +} diff --git a/test/createjs/robotlegs/bender/extensions/mediatorMap/support/ViewInjectedAsRequestedMediator.ts b/test/createjs/robotlegs/bender/extensions/mediatorMap/support/ViewInjectedAsRequestedMediator.ts new file mode 100644 index 0000000..bccb4bb --- /dev/null +++ b/test/createjs/robotlegs/bender/extensions/mediatorMap/support/ViewInjectedAsRequestedMediator.ts @@ -0,0 +1,18 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import { injectable, inject } from "@robotlegsjs/core"; + +@injectable() +export class ViewInjectedAsRequestedMediator { + @inject(createjs.DisplayObject) + public mediatedItem: createjs.DisplayObject; + + public initialize(): void {} + + public destroy(): void {} +} diff --git a/test/createjs/robotlegs/bender/extensions/mediatorMap/support/ViewInjectedMediator.ts b/test/createjs/robotlegs/bender/extensions/mediatorMap/support/ViewInjectedMediator.ts new file mode 100644 index 0000000..0682277 --- /dev/null +++ b/test/createjs/robotlegs/bender/extensions/mediatorMap/support/ViewInjectedMediator.ts @@ -0,0 +1,18 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import { injectable, inject } from "@robotlegsjs/core"; + +@injectable() +export class ViewInjectedMediator { + @inject(createjs.Container) + public mediatedItem: createjs.Container; + + public initialize(): void {} + + public destroy(): void {} +} diff --git a/test/createjs/robotlegs/bender/extensions/viewManager/impl/configureViewEvent.test.ts b/test/createjs/robotlegs/bender/extensions/viewManager/impl/configureViewEvent.test.ts new file mode 100644 index 0000000..cd4b8bd --- /dev/null +++ b/test/createjs/robotlegs/bender/extensions/viewManager/impl/configureViewEvent.test.ts @@ -0,0 +1,46 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import "../../../../../../entry"; + +import { assert } from "chai"; + +import { ConfigureViewEvent } from "../../../../../../../src/robotlegs/bender/extensions/viewManager/impl/ConfigureViewEvent"; + +describe("ConfigureViewEvent", () => { + let container: createjs.Container = null; + let event: ConfigureViewEvent = null; + + beforeEach(() => { + container = new createjs.Container(); + event = new ConfigureViewEvent(ConfigureViewEvent.CONFIGURE_VIEW, container); + }); + + afterEach(() => { + container = null; + event = null; + }); + + it("ensure_static_properties_will_not_change", () => { + assert.equal(ConfigureViewEvent.CONFIGURE_VIEW, "configureView"); + }); + + it("type_is_stored", () => { + assert.equal(event.type, ConfigureViewEvent.CONFIGURE_VIEW); + }); + + it("view_is_stored", () => { + assert.equal(event.view, container); + }); + + it("event_is_cloned", () => { + let clone: ConfigureViewEvent = event.clone(); + assert.equal(clone.type, event.type); + assert.equal(clone.view, event.view); + assert.notEqual(clone, event); + }); +}); diff --git a/test/createjs/robotlegs/bender/extensions/viewManager/impl/containerBinding.test.ts b/test/createjs/robotlegs/bender/extensions/viewManager/impl/containerBinding.test.ts new file mode 100644 index 0000000..9fb8432 --- /dev/null +++ b/test/createjs/robotlegs/bender/extensions/viewManager/impl/containerBinding.test.ts @@ -0,0 +1,157 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import "../../../../../../entry"; + +import { assert } from "chai"; + +import { IClass } from "@robotlegsjs/core"; + +import { IViewHandler } from "../../../../../../../src/robotlegs/bender/extensions/viewManager/api/IViewHandler"; +import { ContainerBinding } from "../../../../../../../src/robotlegs/bender/extensions/viewManager/impl/ContainerBinding"; +import { ContainerBindingEvent } from "../../../../../../../src/robotlegs/bender/extensions/viewManager/impl/ContainerBindingEvent"; + +import { CallbackViewHandler } from "../support/CallbackViewHandler"; + +describe("ContainerBinding", () => { + let container: createjs.Container = null; + let binding: ContainerBinding = null; + + beforeEach(() => { + container = new createjs.Container(); + binding = new ContainerBinding(container); + }); + + afterEach(() => { + container = null; + binding = null; + }); + + it("container_is_stored", () => { + assert.equal(binding.container, container); + }); + + it("parent_is_stored", () => { + let parentContainer: createjs.Container = new createjs.Container(); + let parentBinding = new ContainerBinding(parentContainer); + binding.parent = parentBinding; + assert.equal(binding.parent, parentBinding); + }); + + it("handler_is_invoked", () => { + let callCount: number = 0; + binding.addHandler( + new CallbackViewHandler(function(view: any, type: any): void { + callCount++; + }) + ); + binding.handleView(container, >createjs.Container.constructor); + assert.equal(callCount, 1); + }); + + it("handler_is_passed_correct_details", () => { + const expectedView: createjs.Container = container; + const expectedType: IClass = >createjs.Container.constructor; + let actualView: createjs.Container = null; + let actualType: IClass = null; + binding.addHandler( + new CallbackViewHandler(function(view: any, type: any): void { + actualView = view; + actualType = type; + }) + ); + binding.handleView(expectedView, expectedType); + assert.equal(actualView, expectedView); + assert.equal(actualType, expectedType); + }); + + it("handler_is_not_invoked_after_removal", () => { + let callCount: number = 0; + const handler: IViewHandler = new CallbackViewHandler(function(view: any, type: any): void { + callCount++; + }); + binding.addHandler(handler); + binding.removeHandler(handler); + binding.handleView(container, >createjs.Container.constructor); + assert.equal(callCount, 0); + }); + + it("handler_is_not_invoked_multiple_times_when_added_multiple_times", () => { + let callCount: number = 0; + const handler: IViewHandler = new CallbackViewHandler(function(view: any, type: any): void { + callCount++; + }); + binding.addHandler(handler); + binding.addHandler(handler); + binding.addHandler(handler); + binding.handleView(container, >createjs.Container.constructor); + assert.equal(callCount, 1); + }); + + it("handlers_are_invoked_in_order", () => { + const expected: string[] = ["handler1", "handler2", "handler3"]; + let actual: string[] = []; + binding.addHandler( + new CallbackViewHandler(function(view: any, type: any): void { + actual.push("handler1"); + }) + ); + binding.addHandler( + new CallbackViewHandler(function(view: any, type: any): void { + actual.push("handler2"); + }) + ); + binding.addHandler( + new CallbackViewHandler(function(view: any, type: any): void { + actual.push("handler3"); + }) + ); + binding.handleView(container, >createjs.Container.constructor); + assert.deepEqual(actual, expected); + }); + + it("binding_fires_event_on_empty", () => { + const handler: IViewHandler = new CallbackViewHandler(); + let callCount: number = 0; + binding.addEventListener(ContainerBindingEvent.BINDING_EMPTY, function(event: ContainerBindingEvent): void { + callCount++; + }); + binding.addHandler(handler); + binding.removeHandler(handler); + assert.equal(callCount, 1); + }); + + it("event_on_empty_is_not_invoked_multiple_times_when_handler_is_removed_multiple_times", () => { + const handler: IViewHandler = new CallbackViewHandler(); + let callCount: number = 0; + binding.addEventListener(ContainerBindingEvent.BINDING_EMPTY, function(event: ContainerBindingEvent): void { + callCount++; + }); + binding.addHandler(handler); + binding.removeHandler(handler); + binding.removeHandler(handler); + binding.removeHandler(handler); + assert.equal(callCount, 1); + }); + + it("binding_event_on_empty_fired_once_when_more_than_one_handler_are_added", () => { + const handler1: IViewHandler = new CallbackViewHandler(); + const handler2: IViewHandler = new CallbackViewHandler(); + const handler3: IViewHandler = new CallbackViewHandler(); + let callCount: number = 0; + binding.addEventListener(ContainerBindingEvent.BINDING_EMPTY, function(event: ContainerBindingEvent): void { + callCount++; + }); + binding.addHandler(handler1); + binding.addHandler(handler2); + binding.addHandler(handler3); + binding.removeHandler(handler1); + binding.removeHandler(handler2); + binding.removeHandler(handler3); + assert.equal(callCount, 1); + }); +}); diff --git a/test/createjs/robotlegs/bender/extensions/viewManager/impl/containerBindingEvent.test.ts b/test/createjs/robotlegs/bender/extensions/viewManager/impl/containerBindingEvent.test.ts new file mode 100644 index 0000000..9fff3bd --- /dev/null +++ b/test/createjs/robotlegs/bender/extensions/viewManager/impl/containerBindingEvent.test.ts @@ -0,0 +1,38 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import "../../../../../../entry"; + +import { assert } from "chai"; + +import { ContainerBindingEvent } from "../../../../../../../src/robotlegs/bender/extensions/viewManager/impl/ContainerBindingEvent"; + +describe("ContainerBindingEvent", () => { + let event: ContainerBindingEvent = null; + + beforeEach(() => { + event = new ContainerBindingEvent(ContainerBindingEvent.BINDING_EMPTY); + }); + + afterEach(() => { + event = null; + }); + + it("ensure_static_properties_will_not_change", () => { + assert.equal(ContainerBindingEvent.BINDING_EMPTY, "bindingEmpty"); + }); + + it("type_is_stored", () => { + assert.equal(event.type, ContainerBindingEvent.BINDING_EMPTY); + }); + + it("event_is_cloned", () => { + let clone: ContainerBindingEvent = event.clone(); + assert.equal(clone.type, event.type); + assert.notEqual(clone, event); + }); +}); diff --git a/test/createjs/robotlegs/bender/extensions/viewManager/impl/containerRegistry.test.ts b/test/createjs/robotlegs/bender/extensions/viewManager/impl/containerRegistry.test.ts new file mode 100644 index 0000000..0d9fa18 --- /dev/null +++ b/test/createjs/robotlegs/bender/extensions/viewManager/impl/containerRegistry.test.ts @@ -0,0 +1,278 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import "../../../../../../entry"; + +import { assert } from "chai"; + +import { IViewHandler } from "../../../../../../../src/robotlegs/bender/extensions/viewManager/api/IViewHandler"; +import { ContainerBinding } from "../../../../../../../src/robotlegs/bender/extensions/viewManager/impl/ContainerBinding"; +import { ContainerRegistry } from "../../../../../../../src/robotlegs/bender/extensions/viewManager/impl/ContainerRegistry"; +import { ContainerRegistryEvent } from "../../../../../../../src/robotlegs/bender/extensions/viewManager/impl/ContainerRegistryEvent"; + +import { CallbackViewHandler } from "../support/CallbackViewHandler"; +import { TreeContainer } from "../support/TreeContainer"; + +describe("ContainerRegistry", () => { + let registry: ContainerRegistry = null; + + beforeEach(() => { + registry = new ContainerRegistry(); + }); + + afterEach(() => { + registry = null; + }); + + it("add_container", () => { + let container: createjs.Container = new createjs.Container(); + let containerBinding: ContainerBinding = registry.addContainer(container); + assert.equal(containerBinding.container, container); + }); + + it("add_twice_same_container", () => { + let container: createjs.Container = new createjs.Container(); + let containerBinding1: ContainerBinding = registry.addContainer(container); + let containerBinding2: ContainerBinding = registry.addContainer(container); + assert.equal(containerBinding1.container, container); + assert.equal(containerBinding2.container, container); + assert.equal(containerBinding1, containerBinding2); + }); + + it("get_bindings", () => { + let container1: createjs.Container = new createjs.Container(); + let container2: createjs.Container = new createjs.Container(); + let container3: createjs.Container = new createjs.Container(); + + let containerBinding1: ContainerBinding = registry.addContainer(container1); + let containerBinding2: ContainerBinding = registry.addContainer(container2); + let containerBinding3: ContainerBinding = registry.addContainer(container3); + + let expectedBindings: ContainerBinding[] = [containerBinding1, containerBinding2, containerBinding3]; + + assert.deepEqual(expectedBindings, registry.bindings); + }); + + it("finds_correct_nearest_interested_container_view_and_returns_its_binding", () => { + let searchTrees: TreeContainer[] = createTrees(3, 3); + + for (let searchTree of searchTrees) { + registry.addContainer(searchTree); + } + + let correctTree: TreeContainer; + let result: ContainerBinding; + + for (correctTree of searchTrees) { + for (let treeChild of correctTree.treeChildren) { + result = registry.findParentBinding(treeChild); + assert.equal(result.container, correctTree); + + for (let treeGrandchild of treeChild.treeChildren) { + result = registry.findParentBinding(treeGrandchild); + assert.equal(result.container, correctTree); + + for (let treeGreatGrandchild of treeGrandchild.treeChildren) { + result = registry.findParentBinding(treeGreatGrandchild); + assert.equal(result.container, correctTree); + } + } + } + } + }); + + it("binding_returns_with_correct_interested_parent_chain", () => { + let searchTrees: TreeContainer[] = createTrees(5, 4); + + registry.addContainer(searchTrees[0]); + registry.addContainer(searchTrees[1]); + registry.addContainer(searchTrees[1].treeChildren[3]); + + let searchItem: createjs.Container = searchTrees[1].treeChildren[3].treeChildren[3].treeChildren[3].treeChildren[3]; + let result: ContainerBinding = registry.findParentBinding(searchItem); + + assert.equal(searchTrees[1].treeChildren[3], result.container, "Binding returns with correct container view"); + assert.equal(searchTrees[1], result.parent.container, "Binding returns with correct container parent view"); + assert.equal(null, result.parent.parent, "Further parents are null"); + }); + + it("binding_returns_with_correct_interested_parent_chain_if_interested_views_added_in_wrong_order", () => { + let searchTrees: TreeContainer[] = createTrees(5, 4); + + registry.addContainer(searchTrees[0]); + registry.addContainer(searchTrees[1].treeChildren[3]); + registry.addContainer(searchTrees[1]); + + let searchItem: createjs.Container = searchTrees[1].treeChildren[3].treeChildren[3].treeChildren[3].treeChildren[3]; + let result: ContainerBinding = registry.findParentBinding(searchItem); + + assert.equal(searchTrees[1].treeChildren[3], result.container, "Binding returns with correct container view"); + + assert.equal(searchTrees[1], result.parent.container, "Binding returns with correct container parent view"); + assert.equal(null, result.parent.parent, "Further parents are null"); + }); + + it("binding_returns_with_correct_interested_parent_chain_if_interested_views_added_in_wrong_order_with_gaps", () => { + let searchTrees: TreeContainer[] = createTrees(5, 4); + + registry.addContainer(searchTrees[0]); + registry.addContainer(searchTrees[1].treeChildren[3].treeChildren[2]); + registry.addContainer(searchTrees[1]); + + let searchItem: createjs.Container = searchTrees[1].treeChildren[3].treeChildren[2].treeChildren[3].treeChildren[3]; + let result: ContainerBinding = registry.findParentBinding(searchItem); + + assert.equal(searchTrees[1].treeChildren[3].treeChildren[2], result.container, "Binding returns with correct container view"); + + assert.equal(searchTrees[1], result.parent.container, "Binding returns with correct container parent view"); + assert.equal(null, result.parent.parent, "Further parents are null"); + }); + + it("binding_returns_with_correct_interested_parent_chain_after_removal", () => { + let searchTrees: TreeContainer[] = createTrees(5, 4); + + registry.addContainer(searchTrees[0]); + registry.addContainer(searchTrees[1]); + registry.addContainer(searchTrees[1].treeChildren[3].treeChildren[2].treeChildren[3]); + registry.addContainer(searchTrees[1].treeChildren[3].treeChildren[2]); + registry.addContainer(searchTrees[1].treeChildren[3]); + + registry.removeContainer(searchTrees[1].treeChildren[3].treeChildren[2]); + + let searchItem: createjs.Container = searchTrees[1].treeChildren[3].treeChildren[2].treeChildren[3].treeChildren[3]; + let result: ContainerBinding = registry.findParentBinding(searchItem); + + assert.equal( + searchTrees[1].treeChildren[3].treeChildren[2].treeChildren[3], + result.container, + "Binding returns with correct container view" + ); + assert.equal(searchTrees[1].treeChildren[3], result.parent.container, "Binding returns with correct container parent view"); + assert.equal(searchTrees[1], result.parent.parent.container, "Binding returns with correct container parent parent view"); + assert.equal(null, result.parent.parent.parent, "Further parents are null"); + }); + + it("returns_null_if_search_item_is_not_inside_an_included_view", () => { + let searchTrees: TreeContainer[] = createTrees(5, 4); + + registry.addContainer(searchTrees[0]); + registry.addContainer(searchTrees[1]); + registry.addContainer(searchTrees[1].treeChildren[3].treeChildren[2].treeChildren[3]); + registry.addContainer(searchTrees[1].treeChildren[3].treeChildren[2]); + registry.addContainer(searchTrees[1].treeChildren[3]); + + registry.removeContainer(searchTrees[1].treeChildren[3].treeChildren[2]); + + let searchItem: createjs.Container = searchTrees[2].treeChildren[3].treeChildren[2].treeChildren[3].treeChildren[3]; + let result: ContainerBinding = registry.findParentBinding(searchItem); + + assert.equal(null, result, "Returns null if not inside an included view"); + }); + + it("returns_root_container_view_bindings_one_item", () => { + let searchTrees: TreeContainer[] = createTrees(1, 1); + let expectedBinding: ContainerBinding = registry.addContainer(searchTrees[0]); + let expectedRootBindings: ContainerBinding[] = [expectedBinding]; + assert.deepEqual(expectedRootBindings, registry.rootBindings, "Returns root container view bindings one item"); + }); + + it("returns_root_container_view_bindings_many_items", () => { + let searchTrees: TreeContainer[] = createTrees(5, 4); + let firstExpectedBinding: ContainerBinding = registry.addContainer(searchTrees[0]); + + registry.addContainer(searchTrees[1].treeChildren[3].treeChildren[2].treeChildren[3]); + registry.addContainer(searchTrees[1].treeChildren[3].treeChildren[2]); + + let secondExpectedBinding: ContainerBinding = registry.addContainer(searchTrees[1]); + + registry.addContainer(searchTrees[1].treeChildren[3]); + + let expectedRootBindings: ContainerBinding[] = [firstExpectedBinding, secondExpectedBinding]; + assert.deepEqual(expectedRootBindings, registry.rootBindings, "Returns root container view bindings many items"); + }); + + it("returns_root_container_view_bindings_many_items_after_removals", () => { + let searchTrees: TreeContainer[] = createTrees(5, 4); + let firstExpectedBinding: ContainerBinding = registry.addContainer(searchTrees[0]); + + registry.addContainer(searchTrees[1].treeChildren[3].treeChildren[2].treeChildren[3]); + registry.addContainer(searchTrees[1].treeChildren[3].treeChildren[2]); + registry.addContainer(searchTrees[1]); + + let secondExpectedBinding: ContainerBinding = registry.addContainer(searchTrees[1].treeChildren[3]); + + registry.removeContainer(searchTrees[1]); + + let expectedRootBindings: ContainerBinding[] = [firstExpectedBinding, secondExpectedBinding]; + assert.deepEqual(expectedRootBindings, registry.rootBindings, "Returns root container view bindings many items after removals"); + }); + + it("adding_container_dispatches_event", () => { + let container: createjs.Container = new createjs.Container(); + let callCount: number = 0; + registry.addEventListener(ContainerRegistryEvent.CONTAINER_ADD, function onContainerAdd(event: ContainerRegistryEvent): void { + callCount++; + }); + registry.addContainer(container); + registry.addContainer(container); + assert.equal(callCount, 1); + }); + + it("removing_container_dispatches_event", () => { + let container: createjs.Container = new createjs.Container(); + let callCount: number = 0; + registry.addEventListener(ContainerRegistryEvent.CONTAINER_REMOVE, function onContainerRemove(event: ContainerRegistryEvent): void { + callCount++; + }); + registry.addContainer(container); + registry.removeContainer(container); + registry.removeContainer(container); + assert.equal(callCount, 1); + }); + + it("adding_root_container_dispatches_event", () => { + let container: createjs.Container = new createjs.Container(); + let callCount: number = 0; + registry.addEventListener(ContainerRegistryEvent.ROOT_CONTAINER_ADD, function onRootContainerAdd( + event: ContainerRegistryEvent + ): void { + callCount++; + }); + registry.addContainer(container); + assert.equal(callCount, 1); + }); + + it("removing_root_container_dispatches_event", () => { + let container: createjs.Container = new createjs.Container(); + let callCount: number = 0; + registry.addEventListener(ContainerRegistryEvent.ROOT_CONTAINER_REMOVE, function onRootContainerRemove( + event: ContainerRegistryEvent + ): void { + callCount++; + }); + registry.addContainer(container); + registry.removeContainer(container); + assert.equal(callCount, 1); + }); + + it("empty_binding_is_removed", () => { + let container: createjs.Container = new createjs.Container(); + let handler: IViewHandler = new CallbackViewHandler(); + registry.addContainer(container).addHandler(handler); + registry.getBinding(container).removeHandler(handler); + assert.isUndefined(registry.getBinding(container)); + }); + + function createTrees(treeDepth: number, treeWidth: number): TreeContainer[] { + const trees: TreeContainer[] = []; + for (let i: number = 0; i < treeWidth; i++) { + let treeContainer: TreeContainer = new TreeContainer(treeDepth, treeWidth); + trees.push(treeContainer); + } + return trees; + } +}); diff --git a/test/createjs/robotlegs/bender/extensions/viewManager/impl/containerRegistryEvent.test.ts b/test/createjs/robotlegs/bender/extensions/viewManager/impl/containerRegistryEvent.test.ts new file mode 100644 index 0000000..cab4c92 --- /dev/null +++ b/test/createjs/robotlegs/bender/extensions/viewManager/impl/containerRegistryEvent.test.ts @@ -0,0 +1,49 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import "../../../../../../entry"; + +import { assert } from "chai"; + +import { ContainerRegistryEvent } from "../../../../../../../src/robotlegs/bender/extensions/viewManager/impl/ContainerRegistryEvent"; + +describe("ContainerRegistryEvent", () => { + let container: createjs.Container = null; + let event: ContainerRegistryEvent = null; + + beforeEach(() => { + container = new createjs.Container(); + event = new ContainerRegistryEvent(ContainerRegistryEvent.CONTAINER_ADD, container); + }); + + afterEach(() => { + container = null; + event = null; + }); + + it("ensure_static_properties_will_not_change", () => { + assert.equal(ContainerRegistryEvent.CONTAINER_ADD, "containerAdd"); + assert.equal(ContainerRegistryEvent.CONTAINER_REMOVE, "containerRemove"); + assert.equal(ContainerRegistryEvent.ROOT_CONTAINER_ADD, "rootContainerAdd"); + assert.equal(ContainerRegistryEvent.ROOT_CONTAINER_REMOVE, "rootContainerRemove"); + }); + + it("type_is_stored", () => { + assert.equal(event.type, ContainerRegistryEvent.CONTAINER_ADD); + }); + + it("container_is_stored", () => { + assert.equal(event.container, container); + }); + + it("event_is_cloned", () => { + let clone: ContainerRegistryEvent = event.clone(); + assert.equal(clone.type, event.type); + assert.equal(clone.container, event.container); + assert.notEqual(clone, event); + }); +}); diff --git a/test/createjs/robotlegs/bender/extensions/viewManager/impl/manualStageObserver.test.ts b/test/createjs/robotlegs/bender/extensions/viewManager/impl/manualStageObserver.test.ts new file mode 100644 index 0000000..9e2fb10 --- /dev/null +++ b/test/createjs/robotlegs/bender/extensions/viewManager/impl/manualStageObserver.test.ts @@ -0,0 +1,158 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import "../../../../../../entry"; + +import { assert } from "chai"; + +import { interfaces, Context, IClass, IContext, IInjector } from "@robotlegsjs/core"; + +import { IDisplayObject } from "../../../../../../../src/robotlegs/bender/displayList/api/IDisplayObject"; +import { IDisplayObjectObserver } from "../../../../../../../src/robotlegs/bender/displayList/api/IDisplayObjectObserver"; +import { IDisplayObjectObserverFactory } from "../../../../../../../src/robotlegs/bender/displayList/api/IDisplayObjectObserverFactory"; + +import { ConfigureViewEvent } from "../../../../../../../src/robotlegs/bender/extensions/viewManager/impl/ConfigureViewEvent"; +import { ContainerRegistry } from "../../../../../../../src/robotlegs/bender/extensions/viewManager/impl/ContainerRegistry"; +import { ManualStageObserver } from "../../../../../../../src/robotlegs/bender/extensions/viewManager/impl/ManualStageObserver"; + +import { DisplayObjectObserver } from "../../../displayList/support/DisplayObjectObserver"; + +import { CallbackViewHandler } from "../support/CallbackViewHandler"; + +describe("StageObserver", () => { + let context: IContext = null; + let injector: IInjector = null; + let stage: createjs.Stage = null; + let registry: ContainerRegistry = null; + let observer: ManualStageObserver = null; + + beforeEach(() => { + context = new Context(); + injector = context.injector; + injector.bind>(IDisplayObjectObserverFactory).toFactory(() => { + return (view: IDisplayObject, useCapture: boolean): IDisplayObjectObserver => { + return new DisplayObjectObserver(view, useCapture); + }; + }); + stage = new createjs.Stage("canvas"); + registry = new ContainerRegistry(); + observer = new ManualStageObserver(registry, injector.get(IDisplayObjectObserverFactory)); + }); + + afterEach(() => { + if (context.initialized) { + context.destroy(); + } + + context = null; + injector = null; + + observer.destroy(); + observer = null; + registry = null; + stage = null; + }); + + it("view_is_handled_when_event_is_dispatched", () => { + const expected: createjs.Container = new createjs.Container(); + let actual: createjs.Container = null; + registry.addContainer(stage).addHandler( + new CallbackViewHandler((view: createjs.Container, type: IClass) => { + actual = view; + }) + ); + stage.addChild(expected); + expected.dispatchEvent(new ConfigureViewEvent(ConfigureViewEvent.CONFIGURE_VIEW, expected)); + assert.equal(actual, expected); + }); + + it("view_is_handled_when_added_somewhere_inside_container", () => { + const middle1: createjs.Container = new createjs.Container(); + const middle2: createjs.Container = new createjs.Container(); + const middle3: createjs.Container = new createjs.Container(); + const expected: createjs.Container = middle3; + let actual: createjs.Container = null; + registry.addContainer(stage).addHandler( + new CallbackViewHandler((view: createjs.Container, type: IClass) => { + actual = view; + }) + ); + stage.addChild(middle1); + middle1.addChild(middle2); + middle2.addChild(middle3); + middle3.dispatchEvent(new ConfigureViewEvent(ConfigureViewEvent.CONFIGURE_VIEW, middle3)); + assert.deepEqual(actual, expected); + }); + + it("view_is_handled_when_container_was_already_added_into_registry", () => { + const expected: createjs.Container = new createjs.Container(); + let actual: createjs.Container = null; + registry.addContainer(stage).addHandler( + new CallbackViewHandler((view: createjs.Container, type: IClass) => { + actual = view; + }) + ); + stage.addChild(expected); + expected.dispatchEvent(new ConfigureViewEvent(ConfigureViewEvent.CONFIGURE_VIEW, expected)); + assert.equal(actual, expected); + }); + + it("view_is_not_handled_when_added_outside_container", () => { + let callCount: number = 0; + registry.addContainer(stage).addHandler( + new CallbackViewHandler((view: createjs.Container, type: IClass) => { + callCount++; + }) + ); + let container2: createjs.Container = new createjs.Container(); + let child: createjs.Container = new createjs.Container(); + container2.addChild(child); + child.dispatchEvent(new ConfigureViewEvent(ConfigureViewEvent.CONFIGURE_VIEW, child)); + assert.equal(callCount, 0); + }); + + it("view_is_not_handled_after_container_removal", () => { + let child: createjs.Container = new createjs.Container(); + let callCount: number = 0; + registry.addContainer(stage).addHandler( + new CallbackViewHandler((view: createjs.Container, type: IClass) => { + callCount++; + }) + ); + registry.removeContainer(stage); + stage.addChild(child); + child.dispatchEvent(new ConfigureViewEvent(ConfigureViewEvent.CONFIGURE_VIEW, child)); + assert.equal(callCount, 0); + }); + + it("view_is_not_handled_after_stageObserver_is_destroyed", () => { + let child: createjs.Container = new createjs.Container(); + let callCount: number = 0; + registry.addContainer(stage).addHandler( + new CallbackViewHandler((view: createjs.Container, type: IClass) => { + callCount++; + }) + ); + observer.destroy(); + stage.addChild(child); + child.dispatchEvent(new ConfigureViewEvent(ConfigureViewEvent.CONFIGURE_VIEW, child)); + assert.equal(callCount, 0); + }); + + it("root_container_is_handled_when_added_to_stage", () => { + const expected: createjs.Container = new createjs.Container(); + let actual: createjs.Container = null; + registry.addContainer(stage).addHandler( + new CallbackViewHandler((view: createjs.Container, type: IClass) => { + actual = view; + }) + ); + stage.addChild(expected); + expected.dispatchEvent(new ConfigureViewEvent(ConfigureViewEvent.CONFIGURE_VIEW, expected)); + assert.equal(actual, expected); + }); +}); diff --git a/test/createjs/robotlegs/bender/extensions/viewManager/impl/stageCrawler.test.ts b/test/createjs/robotlegs/bender/extensions/viewManager/impl/stageCrawler.test.ts new file mode 100644 index 0000000..6d18aef --- /dev/null +++ b/test/createjs/robotlegs/bender/extensions/viewManager/impl/stageCrawler.test.ts @@ -0,0 +1,117 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import "../../../../../../entry"; + +import { assert } from "chai"; + +import { IClass } from "@robotlegsjs/core"; + +import { ContainerRegistry } from "../../../../../../../src/robotlegs/bender/extensions/viewManager/impl/ContainerRegistry"; +import { StageCrawler } from "../../../../../../../src/robotlegs/bender/extensions/viewManager/impl/StageCrawler"; + +import { CallbackViewHandler } from "../support/CallbackViewHandler"; + +describe("StageCrawler", () => { + let stage: createjs.Stage = null; + let registry: ContainerRegistry = null; + let crawler: StageCrawler = null; + + beforeEach(() => { + stage = new createjs.Stage("canvas"); + registry = new ContainerRegistry(); + }); + + afterEach(() => { + crawler = null; + stage = null; + }); + + it("scan_finds_container_itself", () => { + let actual: createjs.Container = null; + registry.addContainer(stage).addHandler( + new CallbackViewHandler((view: createjs.Container, type: IClass) => { + actual = view; + }) + ); + crawler = new StageCrawler(registry.getBinding(stage)); + crawler.scan(stage); + assert.equal(actual, stage); + }); + + it("scan_finds_direct_child", () => { + const child: createjs.Container = new createjs.Container(); + const expected: createjs.Container[] = [stage, child]; + let actual: createjs.Container[] = []; + registry.addContainer(stage).addHandler( + new CallbackViewHandler((view: createjs.Container, type: IClass) => { + actual.push(view); + }) + ); + stage.addChild(child); + crawler = new StageCrawler(registry.getBinding(stage)); + crawler.scan(stage); + assert.deepEqual(actual, expected); + }); + + it("scan_finds_all_direct_children", () => { + const child1: createjs.Container = new createjs.Container(); + const child2: createjs.Container = new createjs.Container(); + const child3: createjs.Container = new createjs.Container(); + const expected: createjs.Container[] = [stage, child1, child2, child3]; + let actual: createjs.Container[] = []; + registry.addContainer(stage).addHandler( + new CallbackViewHandler((view: createjs.Container, type: IClass) => { + actual.push(view); + }) + ); + stage.addChild(child1); + stage.addChild(child2); + stage.addChild(child3); + crawler = new StageCrawler(registry.getBinding(stage)); + crawler.scan(stage); + assert.deepEqual(actual, expected); + }); + + it("scan_finds_all_direct_children_that_are_display_object", () => { + const child1: createjs.DisplayObject = new createjs.DisplayObject(); + const child2: createjs.DisplayObject = new createjs.DisplayObject(); + const child3: createjs.DisplayObject = new createjs.DisplayObject(); + const expected: createjs.DisplayObject[] = [stage, child1, child2, child3]; + let actual: createjs.Container[] = []; + registry.addContainer(stage).addHandler( + new CallbackViewHandler((view: createjs.Container, type: IClass) => { + actual.push(view); + }) + ); + stage.addChild(child1); + stage.addChild(child2); + stage.addChild(child3); + crawler = new StageCrawler(registry.getBinding(stage)); + crawler.scan(stage); + assert.deepEqual(actual, expected); + }); + + it("scan_finds_nested_children", () => { + const intermediary: createjs.Container = new createjs.Container(); + const child1: createjs.Container = new createjs.Container(); + const child2: createjs.Container = new createjs.Container(); + const expected: createjs.Container[] = [stage, intermediary, child1, child2]; + let actual: createjs.Container[] = []; + registry.addContainer(stage).addHandler( + new CallbackViewHandler((view: createjs.Container, type: IClass) => { + actual.push(view); + }) + ); + intermediary.addChild(child1); + intermediary.addChild(child2); + stage.addChild(intermediary); + crawler = new StageCrawler(registry.getBinding(stage)); + crawler.scan(stage); + assert.deepEqual(actual, expected); + }); +}); diff --git a/test/createjs/robotlegs/bender/extensions/viewManager/impl/stageObserver.test.ts b/test/createjs/robotlegs/bender/extensions/viewManager/impl/stageObserver.test.ts new file mode 100644 index 0000000..5fd277b --- /dev/null +++ b/test/createjs/robotlegs/bender/extensions/viewManager/impl/stageObserver.test.ts @@ -0,0 +1,147 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import "../../../../../../entry"; + +import { assert } from "chai"; + +import { interfaces, Context, IClass, IContext, IInjector } from "@robotlegsjs/core"; + +import { IDisplayObject } from "../../../../../../../src/robotlegs/bender/displayList/api/IDisplayObject"; +import { IDisplayObjectObserver } from "../../../../../../../src/robotlegs/bender/displayList/api/IDisplayObjectObserver"; +import { IDisplayObjectObserverFactory } from "../../../../../../../src/robotlegs/bender/displayList/api/IDisplayObjectObserverFactory"; + +import { ContainerRegistry } from "../../../../../../../src/robotlegs/bender/extensions/viewManager/impl/ContainerRegistry"; +import { StageObserver } from "../../../../../../../src/robotlegs/bender/extensions/viewManager/impl/StageObserver"; + +import { DisplayObjectObserver } from "../../../displayList/support/DisplayObjectObserver"; + +import { CallbackViewHandler } from "../support/CallbackViewHandler"; + +describe.skip("StageObserver", () => { + let context: IContext = null; + let injector: IInjector = null; + let stage: createjs.Stage = null; + let registry: ContainerRegistry = null; + let observer: StageObserver = null; + + beforeEach(() => { + context = new Context(); + injector = context.injector; + injector.bind>(IDisplayObjectObserverFactory).toFactory(() => { + return (view: IDisplayObject, useCapture: boolean): IDisplayObjectObserver => { + return new DisplayObjectObserver(view, useCapture); + }; + }); + stage = new createjs.Stage("canvas"); + registry = new ContainerRegistry(); + observer = new StageObserver(registry, injector.get(IDisplayObjectObserverFactory)); + }); + + afterEach(() => { + if (context.initialized) { + context.destroy(); + } + + context = null; + injector = null; + + observer.destroy(); + observer = null; + registry = null; + stage = null; + }); + + it("view_is_handled_when_added_to_container", () => { + const expected: createjs.Container = new createjs.Container(); + let actual: createjs.Container = null; + registry.addContainer(stage).addHandler( + new CallbackViewHandler((view: createjs.Container, type: IClass) => { + actual = view; + }) + ); + stage.addChild(expected); + assert.equal(actual, expected); + }); + + it("view_is_handled_when_added_somewhere_inside_container", () => { + const middle1: createjs.Container = new createjs.Container(); + const middle2: createjs.Container = new createjs.Container(); + const middle3: createjs.Container = new createjs.Container(); + const expected: createjs.Container[] = [middle1, middle2, middle3]; + let actual: createjs.Container[] = []; + registry.addContainer(stage).addHandler( + new CallbackViewHandler((view: createjs.Container, type: IClass) => { + actual.push(view); + }) + ); + stage.addChild(middle1); + middle1.addChild(middle2); + middle2.addChild(middle3); + assert.deepEqual(actual, expected); + }); + + it("view_is_handled_when_container_was_already_added_into_registry", () => { + const expected: createjs.Container = new createjs.Container(); + let actual: createjs.Container = null; + registry.addContainer(stage).addHandler( + new CallbackViewHandler((view: createjs.Container, type: IClass) => { + actual = view; + }) + ); + stage.addChild(expected); + assert.equal(actual, expected); + }); + + it("view_is_not_handled_when_added_outside_container", () => { + let callCount: number = 0; + registry.addContainer(stage).addHandler( + new CallbackViewHandler((view: createjs.Container, type: IClass) => { + callCount++; + }) + ); + let container2: createjs.Container = new createjs.Container(); + container2.addChild(new createjs.Container()); + assert.equal(callCount, 0); + }); + + it("view_is_not_handled_after_container_removal", () => { + let callCount: number = 0; + registry.addContainer(stage).addHandler( + new CallbackViewHandler((view: createjs.Container, type: IClass) => { + callCount++; + }) + ); + registry.removeContainer(stage); + stage.addChild(new createjs.Container()); + assert.equal(callCount, 0); + }); + + it("view_is_not_handled_after_stageObserver_is_destroyed", () => { + let callCount: number = 0; + registry.addContainer(stage).addHandler( + new CallbackViewHandler((view: createjs.Container, type: IClass) => { + callCount++; + }) + ); + observer.destroy(); + stage.addChild(new createjs.Container()); + assert.equal(callCount, 0); + }); + + it("root_container_is_handled_when_added_to_stage", () => { + const expected: createjs.Container = new createjs.Container(); + let actual: createjs.Container = null; + registry.addContainer(stage).addHandler( + new CallbackViewHandler((view: createjs.Container, type: IClass) => { + actual = view; + }) + ); + stage.addChild(expected); + assert.equal(actual, expected); + }); +}); diff --git a/test/createjs/robotlegs/bender/extensions/viewManager/impl/viewManager.test.ts b/test/createjs/robotlegs/bender/extensions/viewManager/impl/viewManager.test.ts new file mode 100644 index 0000000..6aa0e4d --- /dev/null +++ b/test/createjs/robotlegs/bender/extensions/viewManager/impl/viewManager.test.ts @@ -0,0 +1,289 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import "../../../../../../entry"; + +import { assert } from "chai"; + +import { interfaces, Context, IClass, IContext, IInjector } from "@robotlegsjs/core"; + +import { IDisplayObject } from "../../../../../../../src/robotlegs/bender/displayList/api/IDisplayObject"; +import { IDisplayObjectObserver } from "../../../../../../../src/robotlegs/bender/displayList/api/IDisplayObjectObserver"; +import { IDisplayObjectObserverFactory } from "../../../../../../../src/robotlegs/bender/displayList/api/IDisplayObjectObserverFactory"; + +import { ContainerRegistry } from "../../../../../../../src/robotlegs/bender/extensions/viewManager/impl/ContainerRegistry"; +import { StageObserver } from "../../../../../../../src/robotlegs/bender/extensions/viewManager/impl/StageObserver"; +import { ViewManager } from "../../../../../../../src/robotlegs/bender/extensions/viewManager/impl/ViewManager"; + +import { DisplayObjectObserver } from "../../../displayList/support/DisplayObjectObserver"; + +import { CallbackViewHandler } from "../support/CallbackViewHandler"; + +describe.skip("ViewManager", () => { + let context: IContext = null; + let injector: IInjector = null; + let stage: createjs.Stage = null; + let registry: ContainerRegistry = null; + let viewManager: ViewManager = null; + let stageObserver: StageObserver = null; + + beforeEach(() => { + context = new Context(); + injector = context.injector; + injector.bind>(IDisplayObjectObserverFactory).toFactory(() => { + return (view: IDisplayObject, useCapture: boolean): IDisplayObjectObserver => { + return new DisplayObjectObserver(view, useCapture); + }; + }); + stage = new createjs.Stage("canvas"); + registry = new ContainerRegistry(); + viewManager = new ViewManager(registry); + stageObserver = new StageObserver(registry, injector.get(IDisplayObjectObserverFactory)); + }); + + afterEach(() => { + stageObserver.destroy(); + stageObserver = null; + viewManager = null; + registry = null; + stage = null; + }); + + it("container_is_added", () => { + viewManager.addContainer(stage); + }); + + it("container_is_stored", () => { + let expectedContainers: any[] = [stage]; + viewManager.addContainer(stage); + assert.deepEqual(viewManager.containers, expectedContainers); + }); + + it("containers_are_stored", () => { + let container1: createjs.Container = new createjs.Container(); + let container2: createjs.Container = new createjs.Container(); + let container3: createjs.Container = new createjs.Container(); + let expectedContainers: any[] = [container1, container2, container3]; + viewManager.addContainer(container1); + viewManager.addContainer(container2); + viewManager.addContainer(container3); + assert.deepEqual(viewManager.containers, expectedContainers); + }); + + it("addContainer_ignores_container_when_added_twice", () => { + let expectedContainers: any[] = [stage]; + viewManager.addContainer(stage); + viewManager.addContainer(stage); + assert.deepEqual(viewManager.containers, expectedContainers); + }); + + it("addContainer_throws_if_containers_are_nested_case1", () => { + function addNestedContainers(): void { + const container1: createjs.Container = new createjs.Container(); + const container2: createjs.Container = new createjs.Container(); + container1.addChild(container2); + viewManager.addContainer(container1); + viewManager.addContainer(container2); + } + assert.throws(addNestedContainers, Error); + }); + + it("addContainer_throws_if_containers_are_nested_case2", () => { + function addNestedContainers(): void { + const container1: createjs.Container = new createjs.Container(); + const container2: createjs.Container = new createjs.Container(); + container2.addChild(container1); + viewManager.addContainer(container1); + viewManager.addContainer(container2); + } + assert.throws(addNestedContainers, Error); + }); + + it("addContainer_throws_if_containers_are_deeply_nested", () => { + function addNestedContainers(): void { + const container1: createjs.Container = new createjs.Container(); + const container2: createjs.Container = new createjs.Container(); + const container3: createjs.Container = new createjs.Container(); + const container4: createjs.Container = new createjs.Container(); + const container5: createjs.Container = new createjs.Container(); + container1.addChild(container2); + container2.addChild(container3); + container3.addChild(container4); + container4.addChild(container5); + viewManager.addContainer(container1); + viewManager.addContainer(container5); + } + assert.throws(addNestedContainers, Error); + }); + + it("handler_is_called", () => { + const expected: createjs.Container = new createjs.Container(); + let actual: createjs.Container = null; + viewManager.addContainer(stage); + viewManager.addViewHandler( + new CallbackViewHandler((view: createjs.Container, type: IClass) => { + actual = view; + }) + ); + stage.addChild(expected); + assert.equal(actual, expected); + }); + + it("handler_is_called_when_added_before_container", () => { + const expected: createjs.Container = new createjs.Container(); + let actual: createjs.Container = null; + viewManager.addViewHandler( + new CallbackViewHandler((view: createjs.Container, type: IClass) => { + actual = view; + }) + ); + viewManager.addContainer(stage); + stage.addChild(expected); + assert.equal(actual, expected); + }); + + it("handler_is_called__once_when_added_twice", () => { + const expected: createjs.Container = new createjs.Container(); + let actual: createjs.Container = null; + let count: number = 0; + let handler: CallbackViewHandler = new CallbackViewHandler((view: createjs.Container, type: IClass) => { + actual = view; + count++; + }); + viewManager.addContainer(stage); + viewManager.addViewHandler(handler); + viewManager.addViewHandler(handler); + stage.addChild(expected); + assert.equal(actual, expected); + assert.equal(count, 1); + }); + + it("handlers_are_called", () => { + const expected: string[] = ["handler1", "handler2", "handler3"]; + let actual: string[] = []; + viewManager.addContainer(stage); + viewManager.addViewHandler( + new CallbackViewHandler((view: createjs.Container, type: IClass) => { + actual.push("handler1"); + }) + ); + viewManager.addViewHandler( + new CallbackViewHandler((view: createjs.Container, type: IClass) => { + actual.push("handler2"); + }) + ); + viewManager.addViewHandler( + new CallbackViewHandler((view: createjs.Container, type: IClass) => { + actual.push("handler3"); + }) + ); + stage.addChild(new createjs.Container()); + assert.deepEqual(actual, expected); + }); + + it("handlers_are_called_when_added_before_container", () => { + const expected: string[] = ["handler1", "handler2", "handler3"]; + let actual: string[] = []; + viewManager.addViewHandler( + new CallbackViewHandler((view: createjs.Container, type: IClass) => { + actual.push("handler1"); + }) + ); + viewManager.addViewHandler( + new CallbackViewHandler((view: createjs.Container, type: IClass) => { + actual.push("handler2"); + }) + ); + viewManager.addViewHandler( + new CallbackViewHandler((view: createjs.Container, type: IClass) => { + actual.push("handler3"); + }) + ); + viewManager.addContainer(stage); + stage.addChild(new createjs.Container()); + assert.deepEqual(actual, expected); + }); + + it("handler_is_not_called_after_container_removal", () => { + let callCount: number = 0; + viewManager.addContainer(stage); + viewManager.addViewHandler( + new CallbackViewHandler((view: createjs.Container, type: IClass) => { + callCount++; + }) + ); + viewManager.removeContainer(stage); + stage.addChild(new createjs.Container()); + assert.equal(callCount, 0); + }); + + it("removeContainer_do_nothing_when_container_was_not_previously_added", () => { + viewManager.removeContainer(stage); + assert.equal(viewManager.containers.length, 0); + }); + + it("handler_is_not_called_after_removeViewHandler", () => { + let callCount: number = 0; + let handler: CallbackViewHandler = new CallbackViewHandler((view: createjs.Container, type: IClass) => { + callCount++; + }); + viewManager.addContainer(stage); + viewManager.addViewHandler(handler); + viewManager.removeViewHandler(handler); + stage.addChild(new createjs.Container()); + assert.equal(callCount, 0); + }); + + it("handler_is_not_called_after_removeViewHandler_called_twice", () => { + let callCount: number = 0; + let handler: CallbackViewHandler = new CallbackViewHandler((view: createjs.Container, type: IClass) => { + callCount++; + }); + viewManager.addContainer(stage); + viewManager.addViewHandler(handler); + viewManager.removeViewHandler(handler); + viewManager.removeViewHandler(handler); + stage.addChild(new createjs.Container()); + assert.equal(callCount, 0); + }); + + it("handler_is_not_called_after_removeAll", () => { + let callCount: number = 0; + viewManager.addContainer(stage); + viewManager.addViewHandler( + new CallbackViewHandler((view: createjs.Container, type: IClass) => { + callCount++; + }) + ); + viewManager.removeAllHandlers(); + stage.addChild(new createjs.Container()); + assert.equal(callCount, 0); + }); + + it("handlers_are_not_called_after_removeAll", () => { + let callCount: number = 0; + viewManager.addContainer(stage); + viewManager.addViewHandler( + new CallbackViewHandler((view: createjs.Container, type: IClass) => { + callCount++; + }) + ); + viewManager.addViewHandler( + new CallbackViewHandler((view: createjs.Container, type: IClass) => { + callCount++; + }) + ); + viewManager.addViewHandler( + new CallbackViewHandler((view: createjs.Container, type: IClass) => { + callCount++; + }) + ); + viewManager.removeAllHandlers(); + stage.addChild(new createjs.Container()); + assert.equal(callCount, 0); + }); +}); diff --git a/test/createjs/robotlegs/bender/extensions/viewManager/impl/viewManagerEvent.test.ts b/test/createjs/robotlegs/bender/extensions/viewManager/impl/viewManagerEvent.test.ts new file mode 100644 index 0000000..c61140d --- /dev/null +++ b/test/createjs/robotlegs/bender/extensions/viewManager/impl/viewManagerEvent.test.ts @@ -0,0 +1,60 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import "../../../../../../entry"; + +import { assert } from "chai"; + +import { IViewHandler } from "../../../../../../../src/robotlegs/bender/extensions/viewManager/api/IViewHandler"; +import { ViewManagerEvent } from "../../../../../../../src/robotlegs/bender/extensions/viewManager/impl/ViewManagerEvent"; + +import { CallbackViewHandler } from "../support/CallbackViewHandler"; + +describe("ViewManagerEvent", () => { + let container: createjs.Container = null; + let handler: IViewHandler = null; + let event: ViewManagerEvent = null; + + beforeEach(() => { + container = new createjs.Container(); + handler = new CallbackViewHandler(); + event = new ViewManagerEvent(ViewManagerEvent.CONTAINER_ADD, container, handler); + }); + + afterEach(() => { + container = null; + handler = null; + event = null; + }); + + it("ensure_static_properties_will_not_change", () => { + assert.equal(ViewManagerEvent.CONTAINER_ADD, "containerAdd"); + assert.equal(ViewManagerEvent.CONTAINER_REMOVE, "containerRemove"); + assert.equal(ViewManagerEvent.HANDLER_ADD, "handlerAdd"); + assert.equal(ViewManagerEvent.HANDLER_REMOVE, "handlerRemove"); + }); + + it("type_is_stored", () => { + assert.equal(event.type, ViewManagerEvent.CONTAINER_ADD); + }); + + it("container_is_stored", () => { + assert.equal(event.container, container); + }); + + it("handler_is_stored", () => { + assert.equal(event.handler, handler); + }); + + it("event_is_cloned", () => { + let clone: ViewManagerEvent = event.clone(); + assert.equal(clone.type, event.type); + assert.equal(clone.container, event.container); + assert.equal(clone.handler, event.handler); + assert.notEqual(clone, event); + }); +}); diff --git a/test/createjs/robotlegs/bender/extensions/viewManager/manualStageObserverExtension.test.ts b/test/createjs/robotlegs/bender/extensions/viewManager/manualStageObserverExtension.test.ts new file mode 100644 index 0000000..26c5bba --- /dev/null +++ b/test/createjs/robotlegs/bender/extensions/viewManager/manualStageObserverExtension.test.ts @@ -0,0 +1,74 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import "../../../../../entry"; + +import { assert } from "chai"; + +import { interfaces, IContext, Context, LogLevel } from "@robotlegsjs/core"; + +import { IDisplayObject } from "../../../../../../src/robotlegs/bender/displayList/api/IDisplayObject"; +import { IDisplayObjectObserver } from "../../../../../../src/robotlegs/bender/displayList/api/IDisplayObjectObserver"; +import { IDisplayObjectObserverFactory } from "../../../../../../src/robotlegs/bender/displayList/api/IDisplayObjectObserverFactory"; + +import { ManualStageObserverExtension } from "../../../../../../src/robotlegs/bender/extensions/viewManager/ManualStageObserverExtension"; +import { ViewManagerExtension } from "../../../../../../src/robotlegs/bender/extensions/viewManager/ViewManagerExtension"; + +import { DisplayObjectObserver } from "../../displayList/support/DisplayObjectObserver"; + +import { CallbackLogTarget } from "../contextView/support/CallbackLogTarget"; +import { LogParams } from "../contextView/support/LogParams"; + +describe("ManualStageObserverExtension", () => { + let context: IContext; + + beforeEach(() => { + context = new Context(); + context.injector + .bind>(IDisplayObjectObserverFactory) + .toFactory(() => { + return (view: IDisplayObject, useCapture: boolean): IDisplayObjectObserver => { + return new DisplayObjectObserver(view, useCapture); + }; + }); + }); + + afterEach(() => { + context.destroy(); + context = null; + }); + + it("installing_after_initialization_throws_error", () => { + function installExtensionAfterInitialization(): void { + context.initialize(); + context.install(ManualStageObserverExtension); + } + assert.throws(installExtensionAfterInitialization, Error); + }); + + it("extension_logs_debug_messages_when_initializing_and_destroying", () => { + let whenInitializingLogged: boolean = false; + let whenDestroyingLogged: boolean = false; + let logTarget: CallbackLogTarget = new CallbackLogTarget((log: LogParams) => { + if (log.source instanceof ManualStageObserverExtension && log.level === LogLevel.DEBUG) { + if (!whenInitializingLogged) { + whenInitializingLogged = log.message === "Creating genuine ManualStageObserver Singleton"; + } + if (!whenDestroyingLogged) { + whenDestroyingLogged = log.message === "Destroying genuine ManualStageObserver Singleton"; + } + } + }); + context.logLevel = LogLevel.DEBUG; + context.install(ViewManagerExtension, ManualStageObserverExtension); + context.addLogTarget(logTarget); + context.initialize(); + context.destroy(); + assert.isTrue(whenInitializingLogged); + assert.isTrue(whenDestroyingLogged); + }); +}); diff --git a/test/createjs/robotlegs/bender/extensions/viewManager/stageCrawlerExtension.test.ts b/test/createjs/robotlegs/bender/extensions/viewManager/stageCrawlerExtension.test.ts new file mode 100644 index 0000000..0ef173b --- /dev/null +++ b/test/createjs/robotlegs/bender/extensions/viewManager/stageCrawlerExtension.test.ts @@ -0,0 +1,141 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import "../../../../../entry"; + +import { assert } from "chai"; + +import { interfaces, IContext, Context, LogLevel } from "@robotlegsjs/core"; + +import { IDisplayObject } from "../../../../../../src/robotlegs/bender/displayList/api/IDisplayObject"; +import { IDisplayObjectObserver } from "../../../../../../src/robotlegs/bender/displayList/api/IDisplayObjectObserver"; +import { IDisplayObjectObserverFactory } from "../../../../../../src/robotlegs/bender/displayList/api/IDisplayObjectObserverFactory"; + +import { ContextView } from "../../../../../../src/robotlegs/bender/extensions/contextView/impl/ContextView"; +import { ContextViewListenerConfig } from "../../../../../../src/robotlegs/bender/extensions/contextView/impl/ContextViewListenerConfig"; +import { ContextViewExtension } from "../../../../../../src/robotlegs/bender/extensions/contextView/ContextViewExtension"; + +import { MediatorMapExtension } from "../../../../../../src/robotlegs/bender/extensions/mediatorMap/MediatorMapExtension"; + +import { IViewHandler } from "../../../../../../src/robotlegs/bender/extensions/viewManager/api/IViewHandler"; +import { ContainerRegistry } from "../../../../../../src/robotlegs/bender/extensions/viewManager/impl/ContainerRegistry"; +import { StageCrawlerExtension } from "../../../../../../src/robotlegs/bender/extensions/viewManager/StageCrawlerExtension"; +import { ViewManagerExtension } from "../../../../../../src/robotlegs/bender/extensions/viewManager/ViewManagerExtension"; + +import { CallbackLogTarget } from "../contextView/support/CallbackLogTarget"; +import { LogParams } from "../contextView/support/LogParams"; + +import { DisplayObjectObserver } from "../../displayList/support/DisplayObjectObserver"; + +import { CallbackViewHandler } from "./support/CallbackViewHandler"; + +describe("StageCrawlerExtension", () => { + let stage: createjs.Stage; + let context: IContext; + + beforeEach(() => { + stage = new createjs.Stage("canvas"); + context = new Context(); + context.injector + .bind>(IDisplayObjectObserverFactory) + .toFactory(() => { + return (view: IDisplayObject, useCapture: boolean): IDisplayObjectObserver => { + return new DisplayObjectObserver(view, useCapture); + }; + }); + }); + + afterEach(() => { + context.destroy(); + context = null; + stage = null; + }); + + it("installing_after_initialization_throws_error", () => { + function installExtensionAfterInitialization(): void { + context.initialize(); + context.install(StageCrawlerExtension); + } + assert.throws(installExtensionAfterInitialization, Error); + }); + + it("extension_logs_debug_message_when_initializing_and_view_manager_is_installed", () => { + let viewManagerIsInstalledLogged: boolean = false; + let scanningContainerLogged: boolean = false; + let logTarget: CallbackLogTarget = new CallbackLogTarget((log: LogParams) => { + if (log.source instanceof StageCrawlerExtension && log.level === LogLevel.DEBUG) { + if (!viewManagerIsInstalledLogged) { + viewManagerIsInstalledLogged = log.message === "ViewManager is installed. Checking for managed containers..."; + } + + if (!scanningContainerLogged) { + scanningContainerLogged = log.message === "StageCrawler scanning container {0} ..."; + } + } + }); + context.logLevel = LogLevel.DEBUG; + context.install(ContextViewExtension, ViewManagerExtension, MediatorMapExtension, StageCrawlerExtension); + context.configure(new ContextView(stage)); + context.configure(ContextViewListenerConfig); + context.addLogTarget(logTarget); + context.initialize(); + assert.isTrue(viewManagerIsInstalledLogged); + assert.isTrue(scanningContainerLogged); + }); + + it("extension_logs_debug_message_when_initializing_and_view_manager_is_not_installed", () => { + let viewManagerIsNotInstalledLogged: boolean = false; + let scanningContainerLogged: boolean = false; + let logTarget: CallbackLogTarget = new CallbackLogTarget((log: LogParams) => { + if (log.source instanceof StageCrawlerExtension && log.level === LogLevel.DEBUG) { + if (!viewManagerIsNotInstalledLogged) { + viewManagerIsNotInstalledLogged = log.message === "ViewManager is not installed. Checking the ContextView..."; + } + + if (!scanningContainerLogged) { + scanningContainerLogged = log.message === "StageCrawler scanning container {0} ..."; + } + } + }); + let handler: IViewHandler = new CallbackViewHandler(); + let registry: ContainerRegistry = new ContainerRegistry(); + + registry.addContainer(stage).addHandler(handler); + + context.logLevel = LogLevel.DEBUG; + context.install(ContextViewExtension, StageCrawlerExtension); + context.configure(new ContextView(stage)); + context.injector.bind(ContainerRegistry).toConstantValue(registry); + context.addLogTarget(logTarget); + context.initialize(); + assert.isTrue(viewManagerIsNotInstalledLogged); + assert.isTrue(scanningContainerLogged); + }); + + it("extension_logs_error_when_context_initialized_without_contextView", () => { + let contextViewIsNotInstalledLogged: boolean = false; + let logTarget: CallbackLogTarget = new CallbackLogTarget((log: LogParams) => { + if (log.source instanceof StageCrawlerExtension && log.level === LogLevel.ERROR) { + if (!contextViewIsNotInstalledLogged) { + contextViewIsNotInstalledLogged = + log.message === "A ContextView must be installed if you install the StageCrawlerExtension."; + } + } + }); + let handler: IViewHandler = new CallbackViewHandler(); + let registry: ContainerRegistry = new ContainerRegistry(); + + registry.addContainer(stage).addHandler(handler); + + context.logLevel = LogLevel.DEBUG; + context.install(ContextViewExtension, StageCrawlerExtension); + context.injector.bind(ContainerRegistry).toConstantValue(registry); + context.addLogTarget(logTarget); + context.initialize(); + assert.isTrue(contextViewIsNotInstalledLogged); + }); +}); diff --git a/test/createjs/robotlegs/bender/extensions/viewManager/stageObserverExtension.test.ts b/test/createjs/robotlegs/bender/extensions/viewManager/stageObserverExtension.test.ts new file mode 100644 index 0000000..3c1157d --- /dev/null +++ b/test/createjs/robotlegs/bender/extensions/viewManager/stageObserverExtension.test.ts @@ -0,0 +1,74 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import "../../../../../entry"; + +import { assert } from "chai"; + +import { interfaces, IContext, Context, LogLevel } from "@robotlegsjs/core"; + +import { IDisplayObject } from "../../../../../../src/robotlegs/bender/displayList/api/IDisplayObject"; +import { IDisplayObjectObserver } from "../../../../../../src/robotlegs/bender/displayList/api/IDisplayObjectObserver"; +import { IDisplayObjectObserverFactory } from "../../../../../../src/robotlegs/bender/displayList/api/IDisplayObjectObserverFactory"; + +import { StageObserverExtension } from "../../../../../../src/robotlegs/bender/extensions/viewManager/StageObserverExtension"; +import { ViewManagerExtension } from "../../../../../../src/robotlegs/bender/extensions/viewManager/ViewManagerExtension"; + +import { CallbackLogTarget } from "../contextView/support/CallbackLogTarget"; +import { LogParams } from "../contextView/support/LogParams"; + +import { DisplayObjectObserver } from "../../displayList/support/DisplayObjectObserver"; + +describe("StageObserverExtension", () => { + let context: IContext; + + beforeEach(() => { + context = new Context(); + context.injector + .bind>(IDisplayObjectObserverFactory) + .toFactory(() => { + return (view: IDisplayObject, useCapture: boolean): IDisplayObjectObserver => { + return new DisplayObjectObserver(view, useCapture); + }; + }); + }); + + afterEach(() => { + context.destroy(); + context = null; + }); + + it("installing_after_initialization_throws_error", () => { + function installExtensionAfterInitialization(): void { + context.initialize(); + context.install(StageObserverExtension); + } + assert.throws(installExtensionAfterInitialization, Error); + }); + + it("extension_logs_debug_messages_when_initializing_and_destroying", () => { + let whenInitializingLogged: boolean = false; + let whenDestroyingLogged: boolean = false; + let logTarget: CallbackLogTarget = new CallbackLogTarget((log: LogParams) => { + if (log.source instanceof StageObserverExtension && log.level === LogLevel.DEBUG) { + if (!whenInitializingLogged) { + whenInitializingLogged = log.message === "Creating genuine StageObserver Singleton"; + } + if (!whenDestroyingLogged) { + whenDestroyingLogged = log.message === "Destroying genuine StageObserver Singleton"; + } + } + }); + context.logLevel = LogLevel.DEBUG; + context.install(ViewManagerExtension, StageObserverExtension); + context.addLogTarget(logTarget); + context.initialize(); + context.destroy(); + assert.isTrue(whenInitializingLogged); + assert.isTrue(whenDestroyingLogged); + }); +}); diff --git a/test/createjs/robotlegs/bender/extensions/viewManager/support/CallbackViewHandler.ts b/test/createjs/robotlegs/bender/extensions/viewManager/support/CallbackViewHandler.ts new file mode 100644 index 0000000..918a22b --- /dev/null +++ b/test/createjs/robotlegs/bender/extensions/viewManager/support/CallbackViewHandler.ts @@ -0,0 +1,27 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import { IClass } from "@robotlegsjs/core"; + +import { IViewHandler } from "../../../../../../../src/robotlegs/bender/extensions/viewManager/api/IViewHandler"; + +/** + * @private + */ +export class CallbackViewHandler implements IViewHandler { + private _callback: Function; + + constructor(callback: Function = null) { + this._callback = callback; + } + + public handleView(view: createjs.Container, type: IClass): void { + if (this._callback) { + this._callback(view, type); + } + } +} diff --git a/test/createjs/robotlegs/bender/extensions/viewManager/support/TreeContainer.ts b/test/createjs/robotlegs/bender/extensions/viewManager/support/TreeContainer.ts new file mode 100644 index 0000000..fdaee74 --- /dev/null +++ b/test/createjs/robotlegs/bender/extensions/viewManager/support/TreeContainer.ts @@ -0,0 +1,38 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +/** + * @private + */ +export class TreeContainer extends createjs.Container { + private _treeDepth: number = 0; + private _treeWidth: number = 0; + private _treeChildren: TreeContainer[] = []; + + constructor(treeDetpth: number, treeWidth: number) { + super(); + + this._treeDepth = treeDetpth; + this._treeWidth = treeWidth; + + this.populate(); + } + + private populate(): void { + if (this._treeDepth > 0) { + for (let i: number = 0; i < this._treeWidth; i++) { + let child: TreeContainer = new TreeContainer(this._treeDepth - 1, this._treeWidth); + this._treeChildren.push(child); + this.addChild(child); + } + } + } + + public get treeChildren(): TreeContainer[] { + return this._treeChildren; + } +} diff --git a/test/createjs/robotlegs/bender/extensions/viewManager/viewManagerExtension.test.ts b/test/createjs/robotlegs/bender/extensions/viewManager/viewManagerExtension.test.ts new file mode 100644 index 0000000..0f95420 --- /dev/null +++ b/test/createjs/robotlegs/bender/extensions/viewManager/viewManagerExtension.test.ts @@ -0,0 +1,48 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +import "../../../../../entry"; + +import { assert } from "chai"; + +import { IContext, Context } from "@robotlegsjs/core"; + +import { IViewManager } from "../../../../../../src/robotlegs/bender/extensions/viewManager/api/IViewManager"; +import { ViewManager } from "../../../../../../src/robotlegs/bender/extensions/viewManager/impl/ViewManager"; +import { ViewManagerExtension } from "../../../../../../src/robotlegs/bender/extensions/viewManager/ViewManagerExtension"; + +describe("ViewManagerExtension", () => { + let context: IContext; + + beforeEach(() => { + context = new Context(); + }); + + afterEach(() => { + context.destroy(); + context = null; + }); + + it("installing after initialization throws error", () => { + function installExtensionAfterInitialization(): void { + context.initialize(); + context.install(ViewManagerExtension); + } + assert.throws(installExtensionAfterInitialization, Error); + }); + + it("viewManager is mapped into injector", () => { + let viewManager: IViewManager = null; + context.install(ViewManagerExtension); + context.whenInitializing(function(): void { + viewManager = context.injector.get(IViewManager); + }); + context.initialize(); + assert.isNotNull(viewManager); + assert.instanceOf(viewManager, ViewManager); + }); +}); diff --git a/test/createjs/tsconfig.json b/test/createjs/tsconfig.json new file mode 100644 index 0000000..3fef135 --- /dev/null +++ b/test/createjs/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "../../tsconfig.createjs.test.json" +} diff --git a/test/entry.ts b/test/entry.ts new file mode 100644 index 0000000..e451446 --- /dev/null +++ b/test/entry.ts @@ -0,0 +1,13 @@ +// ------------------------------------------------------------------------------ +// Copyright (c) 2017-present, RobotlegsJS. All Rights Reserved. +// +// NOTICE: You are permitted to use, modify, and distribute this file +// in accordance with the terms of the license agreement accompanying it. +// ------------------------------------------------------------------------------ + +/// + +import "reflect-metadata"; +import "bluebird/js/browser/bluebird"; +import "es6-symbol/implement"; +import "es6-map/implement"; diff --git a/tsconfig.createjs.test.json b/tsconfig.createjs.test.json new file mode 100644 index 0000000..282d824 --- /dev/null +++ b/tsconfig.createjs.test.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.test.json", + "compilerOptions": { + "outDir": "lib-test-createjs" + }, + "files": [ + "./node_modules/@types/easeljs/index.d.ts" + ] +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..b35197f --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + "outDir": "lib", + "target": "es5", + "lib": ["es7", "dom"], + "types": ["reflect-metadata"], + "sourceMap": true, + "inlineSources": true, + "module": "commonjs", + "moduleResolution": "node", + "experimentalDecorators": true, + "emitDecoratorMetadata": true, + "removeComments": false, + "strict": false, + "noImplicitAny": true, + "strictNullChecks": false, + "noImplicitThis": false, + "alwaysStrict": true, + "noUnusedLocals": true, + "noUnusedParameters": false, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true + }, + "include": [ + "./src/**/*.ts" + ] +} diff --git a/tsconfig.test.json b/tsconfig.test.json new file mode 100644 index 0000000..86bd713 --- /dev/null +++ b/tsconfig.test.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "lib-test" + }, + "include": [ + "./src/**/*.ts", + "./test/**/*.ts" + ] +} diff --git a/tslint.json b/tslint.json new file mode 100644 index 0000000..fa24817 --- /dev/null +++ b/tslint.json @@ -0,0 +1,68 @@ +{ + "extends": [ + "tslint:latest", + "tslint-config-prettier" + ], + "rules": { + "ban-types": [ false ], + "class-name": true, + "comment-format": [ + true, + "check-space" + ], + "curly": true, + "forin": true, + "label-position": true, + "member-access": true, + "member-ordering": [ + true, { + "order": [ + "static-field", + "instance-field", + "constructor", + "public-instance-method", + "protected-instance-method", + "private-instance-method" + ] + } + ], + "no-angle-bracket-type-assertion": false, + "no-arg": true, + "no-bitwise": true, + "no-console": [ + true, + "debug", + "info", + "time", + "timeEnd", + "trace" + ], + "no-construct": true, + "no-debugger": true, + "no-duplicate-variable": true, + "no-empty": false, + "no-eval": true, + "no-inferrable-types": false, + "no-shadowed-variable": true, + "no-string-literal": true, + "no-submodule-imports": false, + "no-switch-case-fall-through": false, + "no-this-assignment": false, + "no-unused-expression": true, + "no-use-before-declare": true, + "no-var-keyword": true, + "object-literal-sort-keys": true, + "ordered-imports": false, + "only-arrow-functions": [ false ], + "prefer-const": false, + "radix":true, + "trailing-comma": [ + false + ], + "triple-equals": [ + true, + "allow-null-check" + ], + "variable-name": false + } +} diff --git a/tslint.test.json b/tslint.test.json new file mode 100644 index 0000000..f47619c --- /dev/null +++ b/tslint.test.json @@ -0,0 +1,10 @@ +{ + "extends": [ + "./tslint.json" + ], + "rules": { + "no-implicit-dependencies": [true, "dev"], + "no-reference": false, + "no-submodule-imports": false + } +} diff --git a/webpack.config.js b/webpack.config.js new file mode 100644 index 0000000..4f5cdd5 --- /dev/null +++ b/webpack.config.js @@ -0,0 +1,81 @@ +const webpack = require("webpack"); +const path = require("path"); +const UglifyJsPlugin = require("uglifyjs-webpack-plugin"); + +module.exports = env => { + + if (!env) env = { production: false, karma: false, library: "" }; + + let mode = env.production ? "production" : "development"; + let tsconfig = !env.karma ? "tsconfig.json" : `tsconfig.${env.library}.test.json`; + let output = env.production ? "dist" : `dist-test-${env.library}`; + let filename = env.karma ? `${env.library}.[name].[hash].js` : (env.production ? "robotlegs-displaylist.min.js" : "robotlegs-displaylist.js"); + let library = env.production ? "RobotlegsJSDisplayList" : `RobotlegsJSDisplayList${env.library}`; + + return { + mode: mode, + + entry: { + main: path.join(__dirname, "src/index.ts") + }, + + output: { + path: path.join(__dirname, output), + filename: filename, + + libraryTarget: "var", + library: library + }, + + devtool: env.production ? undefined : "inline-source-map", + + module: { + rules: [ + { + test: /\.ts$/, + loader: "ts-loader?configFile=" + tsconfig + }, + { + test: ((env.production) /* disable this loader for production builds */ + ? /^$/ + : /^.*(src).*\.ts$/), + loader: "istanbul-instrumenter-loader", + query: { + embedSource: true + }, + enforce: "post" + } + ] + }, + + plugins: ( + (env.production) + ? [] + : [ new webpack.SourceMapDevToolPlugin({ test: /\.ts$/i }) ] + ), + + optimization: + (env.production) + ? { + concatenateModules: true, + minimize: true, + minimizer: [ + new UglifyJsPlugin({ + cache: true, + parallel: 4, + uglifyOptions: { + output: { + comments: false + } + } + }) + ] + } + : {} + , + + resolve: { + extensions: [".ts", ".js", ".json"] + } + } +}; diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..0e9be6a --- /dev/null +++ b/yarn.lock @@ -0,0 +1,7919 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/code-frame@^7.0.0": + version "7.0.0" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" + integrity sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA== + dependencies: + "@babel/highlight" "^7.0.0" + +"@babel/generator@^7.0.0", "@babel/generator@^7.1.3": + version "7.1.3" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.1.3.tgz#2103ec9c42d9bdad9190a6ad5ff2d456fd7b8673" + integrity sha512-ZoCZGcfIJFJuZBqxcY9OjC1KW2lWK64qrX1o4UYL3yshVhwKFYgzpWZ0vvtGMNJdTlvkw0W+HR1VnYN8q3QPFQ== + dependencies: + "@babel/types" "^7.1.3" + jsesc "^2.5.1" + lodash "^4.17.10" + source-map "^0.5.0" + trim-right "^1.0.1" + +"@babel/helper-function-name@^7.1.0": + version "7.1.0" + resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz#a0ceb01685f73355d4360c1247f582bfafc8ff53" + integrity sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw== + dependencies: + "@babel/helper-get-function-arity" "^7.0.0" + "@babel/template" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-get-function-arity@^7.0.0": + version "7.0.0" + resolved "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3" + integrity sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-split-export-declaration@^7.0.0": + version "7.0.0" + resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz#3aae285c0311c2ab095d997b8c9a94cad547d813" + integrity sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/highlight@^7.0.0": + version "7.0.0" + resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4" + integrity sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw== + dependencies: + chalk "^2.0.0" + esutils "^2.0.2" + js-tokens "^4.0.0" + +"@babel/parser@^7.0.0", "@babel/parser@^7.1.2", "@babel/parser@^7.1.3": + version "7.1.3" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.1.3.tgz#2c92469bac2b7fbff810b67fca07bd138b48af77" + integrity sha512-gqmspPZOMW3MIRb9HlrnbZHXI1/KHTOroBwN1NcLL6pWxzqzEKGvRTq0W/PxS45OtQGbaFikSQpkS5zbnsQm2w== + +"@babel/template@^7.0.0", "@babel/template@^7.1.0": + version "7.1.2" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.1.2.tgz#090484a574fef5a2d2d7726a674eceda5c5b5644" + integrity sha512-SY1MmplssORfFiLDcOETrW7fCLl+PavlwMh92rrGcikQaRq4iWPVH0MpwPpY3etVMx6RnDjXtr6VZYr/IbP/Ag== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.1.2" + "@babel/types" "^7.1.2" + +"@babel/traverse@^7.0.0": + version "7.1.4" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.1.4.tgz#f4f83b93d649b4b2c91121a9087fa2fa949ec2b4" + integrity sha512-my9mdrAIGdDiSVBuMjpn/oXYpva0/EZwWL3sm3Wcy/AVWO2eXnsoZruOT9jOGNRXU8KbCIu5zsKnXcAJ6PcV6Q== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.1.3" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.0.0" + "@babel/parser" "^7.1.3" + "@babel/types" "^7.1.3" + debug "^3.1.0" + globals "^11.1.0" + lodash "^4.17.10" + +"@babel/types@^7.0.0", "@babel/types@^7.1.2", "@babel/types@^7.1.3": + version "7.1.3" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.1.3.tgz#3a767004567060c2f40fca49a304712c525ee37d" + integrity sha512-RpPOVfK+yatXyn8n4PB1NW6k9qjinrXrRR8ugBN8fD6hCy5RXI6PSbVqpOJBO9oSaY7Nom4ohj35feb0UR9hSA== + dependencies: + esutils "^2.0.2" + lodash "^4.17.10" + to-fast-properties "^2.0.0" + +"@choojs/findup@^0.2.0": + version "0.2.1" + resolved "https://registry.npmjs.org/@choojs/findup/-/findup-0.2.1.tgz#ac13c59ae7be6e1da64de0779a0a7f03d75615a3" + integrity sha512-YstAqNb0MCN8PjdLCDfRsBcGVRN41f3vgLvaI0IrIcBp4AqILRSS0DeWNGkicC+f/zRIPJLc+9RURVSepwvfBw== + dependencies: + commander "^2.15.1" + +"@mrmlnc/readdir-enhanced@^2.2.1": + version "2.2.1" + resolved "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" + integrity sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g== + dependencies: + call-me-maybe "^1.0.1" + glob-to-regexp "^0.3.0" + +"@nodelib/fs.stat@^1.0.1": + version "1.1.2" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.2.tgz#54c5a964462be3d4d78af631363c18d6fa91ac26" + integrity sha512-yprFYuno9FtNsSHVlSWd+nRlmGoAbqbeCwOryP6sC/zoCjhpArcRMYp19EvpSUSizJAlsXEwJv+wcWS9XaXdMw== + +"@robotlegsjs/core@^0.2.1": + version "0.2.1" + resolved "https://registry.npmjs.org/@robotlegsjs/core/-/core-0.2.1.tgz#4a77f0b85e67343866c44772387617470b67f6c3" + integrity sha512-GookVVseOR1cuG3FimiBPuUQkt9pV8k0HWH7ZqgPwrh17/Yq2109Q4z9E8gVcQVgzs7RQiyafVCw5d84Ree1ew== + dependencies: + inversify "^4.13.0" + tslib "^1.9.3" + +"@sinonjs/formatio@3.0.0": + version "3.0.0" + resolved "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-3.0.0.tgz#9d282d81030a03a03fa0c5ce31fd8786a4da311a" + integrity sha512-vdjoYLDptCgvtJs57ULshak3iJe4NW3sJ3g36xVDGff5AE8P30S6A093EIEPjdi2noGhfuNOEkbxt3J3awFW1w== + dependencies: + "@sinonjs/samsam" "2.1.0" + +"@sinonjs/formatio@^2.0.0": + version "2.0.0" + resolved "http://registry.npmjs.org/@sinonjs/formatio/-/formatio-2.0.0.tgz#84db7e9eb5531df18a8c5e0bfb6e449e55e654b2" + integrity sha512-ls6CAMA6/5gG+O/IdsBcblvnd8qcO/l1TYoNeAzp3wcISOxlPXQEus0mLcdwazEkWjaBdaJ3TaxmNgCLWwvWzg== + dependencies: + samsam "1.3.0" + +"@sinonjs/samsam@2.1.0": + version "2.1.0" + resolved "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-2.1.0.tgz#b8b8f5b819605bd63601a6ede459156880f38ea3" + integrity sha512-5x2kFgJYupaF1ns/RmharQ90lQkd2ELS8A9X0ymkAAdemYHGtI2KiUHG8nX2WU0T1qgnOU5YMqnBM2V7NUanNw== + dependencies: + array-from "^2.1.1" + +"@types/bluebird@^3.5.24": + version "3.5.24" + resolved "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.24.tgz#11f76812531c14f793b8ecbf1de96f672905de8a" + integrity sha512-YeQoDpq4Lm8ppSBqAnAeF/xy1cYp/dMTif2JFcvmAbETMRlvKHT2iLcWu+WyYiJO3b3Ivokwo7EQca/xfLVJmg== + +"@types/chai@^4.1.6": + version "4.1.6" + resolved "https://registry.npmjs.org/@types/chai/-/chai-4.1.6.tgz#1eb26c040e3a84205b1008ad55c800e5e8a94e34" + integrity sha512-CBk7KTZt3FhPsEkYioG6kuCIpWISw+YI8o+3op4+NXwTpvAPxE1ES8+PY8zfaK2L98b1z5oq03UHa4VYpeUxnw== + +"@types/core-js@^2.5.0": + version "2.5.0" + resolved "https://registry.npmjs.org/@types/core-js/-/core-js-2.5.0.tgz#35cc282488de6f10af1d92902899a3b8ca3fbc47" + integrity sha512-qjkHL3wF0JMHMqgm/kmL8Pf8rIiqvueEiZ0g6NVTcBX1WN46GWDr+V5z+gsHUeL0n8TfAmXnYmF7ajsxmBp4PQ== + +"@types/createjs-lib@*": + version "0.0.29" + resolved "http://registry.npmjs.org/@types/createjs-lib/-/createjs-lib-0.0.29.tgz#fae82e3ba8606663b190e789cec7d9c728fc41d7" + integrity sha1-+uguO6hgZmOxkOeJzsfZxyj8Qdc= + +"@types/easeljs@^1.0.0": + version "1.0.0" + resolved "https://registry.npmjs.org/@types/easeljs/-/easeljs-1.0.0.tgz#b339ca0a8d0148819831b0140254d697fd46d974" + integrity sha512-DkhxqkgylaZGeuod35MCiv1Rix8GnBGv+URRBZt4rsMvhyi7Iap6SZbeEN5bD3b8BXHozHEKB/to9ohUDr3GIA== + dependencies: + "@types/createjs-lib" "*" + "@types/tweenjs" "*" + +"@types/mocha@^5.2.5": + version "5.2.5" + resolved "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.5.tgz#8a4accfc403c124a0bafe8a9fc61a05ec1032073" + integrity sha512-lAVp+Kj54ui/vLUFxsJTMtWvZraZxum3w3Nwkble2dNuV5VnPA+Mi2oGX9XYJAaIvZi3tn3cbjS/qcJXRb6Bww== + +"@types/sinon@^5.0.5": + version "5.0.5" + resolved "https://registry.npmjs.org/@types/sinon/-/sinon-5.0.5.tgz#de600fa07eb1ec9d5f55669d5bac46a75fc88115" + integrity sha512-Wnuv66VhvAD2LEJfZkq8jowXGxe+gjVibeLCYcVBp7QLdw0BFx2sRkKzoiiDkYEPGg5VyqO805Rcj0stVjQwCQ== + +"@types/tweenjs@*": + version "1.0.0" + resolved "https://registry.npmjs.org/@types/tweenjs/-/tweenjs-1.0.0.tgz#a27b9e6abe27bac19ebbdb7de1d98c31ac40c064" + integrity sha512-qn0yChkBM0uCDdovXCyZT+HREWP5PaPWrGBuQZ0GIANHZ4E4PZ35vrczagmTyewRwTFJ82/TcYQAvozjNmfcTw== + dependencies: + "@types/createjs-lib" "*" + +"@webassemblyjs/ast@1.7.8": + version "1.7.8" + resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.7.8.tgz#f31f480debeef957f01b623f27eabc695fa4fe8f" + integrity sha512-dOrtdtEyB8sInpl75yLPNksY4sRl0j/+t6aHyB/YA+ab9hV3Fo7FmG12FHzP+2MvWVAJtDb+6eXR5EZbZJ+uVg== + dependencies: + "@webassemblyjs/helper-module-context" "1.7.8" + "@webassemblyjs/helper-wasm-bytecode" "1.7.8" + "@webassemblyjs/wast-parser" "1.7.8" + +"@webassemblyjs/floating-point-hex-parser@1.7.8": + version "1.7.8" + resolved "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.8.tgz#1b3ed0e27e384032254e9322fc646dd3e70ef1b9" + integrity sha512-kn2zNKGsbql5i56VAgRYkpG+VazqHhQQZQycT2uXAazrAEDs23gy+Odkh5VblybjnwX2/BITkDtNmSO76hdIvQ== + +"@webassemblyjs/helper-api-error@1.7.8": + version "1.7.8" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.8.tgz#a2b49c11f615e736f815ec927f035dcfa690d572" + integrity sha512-xUwxDXsd1dUKArJEP5wWM5zxgCSwZApSOJyP1XO7M8rNUChUDblcLQ4FpzTpWG2YeylMwMl1MlP5Ztryiz1x4g== + +"@webassemblyjs/helper-buffer@1.7.8": + version "1.7.8" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.8.tgz#3fc66bfa09c1c60e824cf3d5887826fac062877d" + integrity sha512-WXiIMnuvuwlhWvVOm8xEXU9DnHaa3AgAU0ZPfvY8vO1cSsmYb2WbGbHnMLgs43vXnA7XAob9b56zuZaMkxpCBg== + +"@webassemblyjs/helper-code-frame@1.7.8": + version "1.7.8" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.8.tgz#cc5a7e9522b70e7580df056dfd34020cf29645b0" + integrity sha512-TLQxyD9qGOIdX5LPQOPo0Ernd88U5rHkFb8WAjeMIeA0sPjCHeVPaGqUGGIXjUcblUkjuDAc07bruCcNHUrHDA== + dependencies: + "@webassemblyjs/wast-printer" "1.7.8" + +"@webassemblyjs/helper-fsm@1.7.8": + version "1.7.8" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.8.tgz#fe4607430af466912797c21acafd3046080182ea" + integrity sha512-TjK0CnD8hAPkV5mbSp5aWl6SO1+H3WFcjWtixWoy8EMA99YnNzYhpc/WSYWhf7yrhpzkq5tZB0tvLK3Svr3IXA== + +"@webassemblyjs/helper-module-context@1.7.8": + version "1.7.8" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.8.tgz#3c2e7ee93d14ff4768ba66fb1be42fdc9dc7160a" + integrity sha512-uCutAKR7Nm0VsFixcvnB4HhAyHouNbj0Dx1p7eRjFjXGGZ+N7ftTaG1ZbWCasAEbtwGj54LP8+lkBZdTCPmLGg== + +"@webassemblyjs/helper-wasm-bytecode@1.7.8": + version "1.7.8" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.8.tgz#89bdb78cd6dd5209ae2ed2925de78d0f0e00b6f0" + integrity sha512-AdCCE3BMW6V34WYaKUmPgVHa88t2Z14P4/0LjLwuGkI0X6pf7nzp0CehzVVk51cKm2ymVXjl9dCG+gR1yhITIQ== + +"@webassemblyjs/helper-wasm-section@1.7.8": + version "1.7.8" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.8.tgz#c68ef7d26a6fc12421b2e6e56f9bc810dfb33e87" + integrity sha512-BkBhYQuzyl4hgTGOKo87Vdw6f9nj8HhI7WYpI0MCC5qFa5ahrAPOGgyETVdnRbv+Rjukl9MxxfDmVcVC435lDg== + dependencies: + "@webassemblyjs/ast" "1.7.8" + "@webassemblyjs/helper-buffer" "1.7.8" + "@webassemblyjs/helper-wasm-bytecode" "1.7.8" + "@webassemblyjs/wasm-gen" "1.7.8" + +"@webassemblyjs/ieee754@1.7.8": + version "1.7.8" + resolved "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.7.8.tgz#1f37974b13cb486a9237e73ce04cac7a2f1265ed" + integrity sha512-tOarWChdG1a3y1yqCX0JMDKzrat5tQe4pV6K/TX19BcXsBLYxFQOL1DEDa5KG9syeyvCrvZ+i1+Mv1ExngvktQ== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.7.8": + version "1.7.8" + resolved "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.7.8.tgz#1bee83426819192db2ea1a234b84c7ebc6d34c1f" + integrity sha512-GCYeGPgUFWJiZuP4NICbcyUQNxNLJIf476Ei+K+jVuuebtLpfvwkvYT6iTUE7oZYehhkor4Zz2g7SJ/iZaPudQ== + dependencies: + "@xtuc/long" "4.2.1" + +"@webassemblyjs/utf8@1.7.8": + version "1.7.8" + resolved "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.7.8.tgz#2b489d5cf43e0aebb93d8e2d792aff9879c61f05" + integrity sha512-9X+f0VV+xNXW2ujfIRSXBJENGE6Qh7bNVKqu3yDjTFB3ar3nsThsGBBKdTG58aXOm2iUH6v28VIf88ymPXODHA== + +"@webassemblyjs/wasm-edit@1.7.8": + version "1.7.8" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.8.tgz#f8bdbe7088718eca27b1c349bb7c06b8a457950c" + integrity sha512-6D3Hm2gFixrfyx9XjSON4ml1FZTugqpkIz5Awvrou8fnpyprVzcm4X8pyGRtA2Piixjl3DqmX/HB1xdWyE097A== + dependencies: + "@webassemblyjs/ast" "1.7.8" + "@webassemblyjs/helper-buffer" "1.7.8" + "@webassemblyjs/helper-wasm-bytecode" "1.7.8" + "@webassemblyjs/helper-wasm-section" "1.7.8" + "@webassemblyjs/wasm-gen" "1.7.8" + "@webassemblyjs/wasm-opt" "1.7.8" + "@webassemblyjs/wasm-parser" "1.7.8" + "@webassemblyjs/wast-printer" "1.7.8" + +"@webassemblyjs/wasm-gen@1.7.8": + version "1.7.8" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.8.tgz#7e8abf1545eae74ac6781d545c034af3cfd0c7d5" + integrity sha512-a7O/wE6eBeVKKUYgpMK7NOHmMADD85rSXLe3CqrWRDwWff5y3cSVbzpN6Qv3z6C4hdkpq9qyij1Ga1kemOZGvQ== + dependencies: + "@webassemblyjs/ast" "1.7.8" + "@webassemblyjs/helper-wasm-bytecode" "1.7.8" + "@webassemblyjs/ieee754" "1.7.8" + "@webassemblyjs/leb128" "1.7.8" + "@webassemblyjs/utf8" "1.7.8" + +"@webassemblyjs/wasm-opt@1.7.8": + version "1.7.8" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.8.tgz#7ada6e211914728fce02ff0ff9c344edc6d41f26" + integrity sha512-3lbQ0PT81NHCdi1sR/7+SNpZadM4qYcTSr62nFFAA7e5lFwJr14M1Gi+A/Y3PgcDWOHYjsaNGPpPU0H03N6Blg== + dependencies: + "@webassemblyjs/ast" "1.7.8" + "@webassemblyjs/helper-buffer" "1.7.8" + "@webassemblyjs/wasm-gen" "1.7.8" + "@webassemblyjs/wasm-parser" "1.7.8" + +"@webassemblyjs/wasm-parser@1.7.8": + version "1.7.8" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.8.tgz#dac47c291fb6a3e63529aecd647592cd34afbf94" + integrity sha512-rZ/zlhp9DHR/05zh1MbAjT2t624sjrPP/OkJCjXqzm7ynH+nIdNcn9Ixc+qzPMFXhIrk0rBoQ3to6sEIvHh9jQ== + dependencies: + "@webassemblyjs/ast" "1.7.8" + "@webassemblyjs/helper-api-error" "1.7.8" + "@webassemblyjs/helper-wasm-bytecode" "1.7.8" + "@webassemblyjs/ieee754" "1.7.8" + "@webassemblyjs/leb128" "1.7.8" + "@webassemblyjs/utf8" "1.7.8" + +"@webassemblyjs/wast-parser@1.7.8": + version "1.7.8" + resolved "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.7.8.tgz#f8aab9a450c048c1f9537695c89faeb92fabfba5" + integrity sha512-Q/zrvtUvzWuSiJMcSp90fi6gp2nraiHXjTV2VgAluVdVapM4gy1MQn7akja2p6eSBDQpKJPJ6P4TxRkghRS5dg== + dependencies: + "@webassemblyjs/ast" "1.7.8" + "@webassemblyjs/floating-point-hex-parser" "1.7.8" + "@webassemblyjs/helper-api-error" "1.7.8" + "@webassemblyjs/helper-code-frame" "1.7.8" + "@webassemblyjs/helper-fsm" "1.7.8" + "@xtuc/long" "4.2.1" + +"@webassemblyjs/wast-printer@1.7.8": + version "1.7.8" + resolved "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.7.8.tgz#e7e965782c1912f6a965f14a53ff43d8ad0403a5" + integrity sha512-GllIthRtwTxRDAURRNXscu7Napzmdf1jt1gpiZiK/QN4fH0lSGs3OTmvdfsMNP7tqI4B3ZtfaaWRlNIQug6Xyg== + dependencies: + "@webassemblyjs/ast" "1.7.8" + "@webassemblyjs/wast-parser" "1.7.8" + "@xtuc/long" "4.2.1" + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.1": + version "4.2.1" + resolved "https://registry.npmjs.org/@xtuc/long/-/long-4.2.1.tgz#5c85d662f76fa1d34575766c5dcd6615abcd30d8" + integrity sha512-FZdkNBDqBRHKQ2MEbSC17xnPFOhZxeJ2YGSfr2BKf3sujG49Qe3bB+rGCwQfIaA7WHnGeGkSijX4FuBCdrzW/g== + +abbrev@1: + version "1.1.1" + resolved "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +abbrev@1.0.x: + version "1.0.9" + resolved "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" + integrity sha1-kbR5JYinc4wl813W9jdSovh3YTU= + +accepts@~1.3.4, accepts@~1.3.5: + version "1.3.5" + resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2" + integrity sha1-63d99gEXI6OxTopywIBcjoZ0a9I= + dependencies: + mime-types "~2.1.18" + negotiator "0.6.1" + +acorn-dynamic-import@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz#901ceee4c7faaef7e07ad2a47e890675da50a278" + integrity sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg== + dependencies: + acorn "^5.0.0" + +acorn@^5.0.0, acorn@^5.6.2: + version "5.7.3" + resolved "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" + integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== + +after@0.8.2: + version "0.8.2" + resolved "https://registry.npmjs.org/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" + integrity sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8= + +ajv-errors@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.0.tgz#ecf021fa108fd17dfb5e6b383f2dd233e31ffc59" + integrity sha1-7PAh+hCP0X37Xms4Py3SM+Mf/Fk= + +ajv-keywords@^3.1.0: + version "3.2.0" + resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz#e86b819c602cf8821ad637413698f1dec021847a" + integrity sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo= + +ajv@^5.0.0, ajv@^5.3.0: + version "5.5.2" + resolved "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" + integrity sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU= + dependencies: + co "^4.6.0" + fast-deep-equal "^1.0.0" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.3.0" + +ajv@^6.1.0: + version "6.5.4" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.5.4.tgz#247d5274110db653706b550fcc2b797ca28cfc59" + integrity sha512-4Wyjt8+t6YszqaXnLDfMmG/8AlO5Zbcsy3ATHncCzjW/NoPzAId8AK6749Ybjmdt+kUY1gP60fCu46oDxPv/mg== + dependencies: + fast-deep-equal "^2.0.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +always-error@1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/always-error/-/always-error-1.0.0.tgz#95c84042cfa86f38c86ca6c2cc42c0a0103441b2" + integrity sha1-lchAQs+obzjIbKbCzELAoBA0QbI= + +amdefine@>=0.0.4, amdefine@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU= + +ansi-align@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" + integrity sha1-w2rsy6VjuJzrVW82kPCx2eNUf38= + dependencies: + string-width "^2.0.0" + +ansi-colors@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.1.0.tgz#dcfaacc90ef9187de413ec3ef8d5eb981a98808f" + integrity sha512-hTv1qPdi+sVEk3jYsdjox5nQI0C9HTbjKShbCdYLKb1LOfNbb7wsF4d7OEKIZoxIHx02tSp3m94jcPW2EfMjmA== + +ansi-cyan@^0.1.1: + version "0.1.1" + resolved "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz#538ae528af8982f28ae30d86f2f17456d2609873" + integrity sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM= + dependencies: + ansi-wrap "0.1.0" + +ansi-escapes@^1.0.0: + version "1.4.0" + resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" + integrity sha1-06ioOzGapneTZisT52HHkRQiMG4= + +ansi-escapes@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30" + integrity sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw== + +ansi-gray@^0.1.1: + version "0.1.1" + resolved "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz#2962cf54ec9792c48510a3deb524436861ef7251" + integrity sha1-KWLPVOyXksSFEKPetSRDaGHvclE= + dependencies: + ansi-wrap "0.1.0" + +ansi-html@0.0.7: + version "0.0.7" + resolved "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" + integrity sha1-gTWEAhliqenm/QOflA0S9WynhZ4= + +ansi-red@^0.1.1: + version "0.1.1" + resolved "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz#8c638f9d1080800a353c9c28c8a81ca4705d946c" + integrity sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw= + dependencies: + ansi-wrap "0.1.0" + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-wrap@0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf" + integrity sha1-qCJQ3bABXponyoLoLqYDu/pF768= + +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + +append-transform@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz#046a52ae582a228bd72f58acfbe2967c678759ab" + integrity sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw== + dependencies: + default-require-extensions "^2.0.0" + +aproba@^1.0.3, aproba@^1.1.1: + version "1.2.0" + resolved "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + +are-we-there-yet@~1.1.2: + version "1.1.5" + resolved "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" + integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +arr-diff@^1.0.1: + version "1.1.0" + resolved "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz#687c32758163588fef7de7b36fabe495eb1a399a" + integrity sha1-aHwydYFjWI/vfeezb6vklesaOZo= + dependencies: + arr-flatten "^1.0.1" + array-slice "^0.2.3" + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + +arr-flatten@^1.0.1, arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +arr-union@^2.0.1: + version "2.1.0" + resolved "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz#20f9eab5ec70f5c7d215b1077b1c39161d292c7d" + integrity sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0= + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + +array-differ@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" + integrity sha1-7/UuN1gknTO+QCuLuOVkuytdQDE= + +array-filter@~0.0.0: + version "0.0.1" + resolved "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec" + integrity sha1-fajPLiZijtcygDWB/SH2fKzS7uw= + +array-find-index@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" + integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= + +array-flatten@^2.1.0: + version "2.1.1" + resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.1.tgz#426bb9da84090c1838d812c8150af20a8331e296" + integrity sha1-Qmu52oQJDBg42BLIFQryCoMx4pY= + +array-from@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz#cfe9d8c26628b9dc5aecc62a9f5d8f1f352c1195" + integrity sha1-z+nYwmYoudxa7MYqn12PHzUsEZU= + +array-map@~0.0.0: + version "0.0.0" + resolved "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz#88a2bab73d1cf7bcd5c1b118a003f66f665fa662" + integrity sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI= + +array-reduce@~0.0.0: + version "0.0.0" + resolved "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b" + integrity sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys= + +array-slice@^0.2.3: + version "0.2.3" + resolved "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5" + integrity sha1-3Tz7gO15c6dRF82sabC5nshhhvU= + +array-union@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= + dependencies: + array-uniq "^1.0.1" + +array-uniq@^1.0.1, array-uniq@^1.0.2: + version "1.0.3" + resolved "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= + +array-unique@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" + integrity sha1-odl8yvy8JiXMcPrc6zalDFiwGlM= + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + +arraybuffer.slice@~0.0.7: + version "0.0.7" + resolved "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz#3bbc4275dd584cc1b10809b89d4e8b63a69e7675" + integrity sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog== + +arrify@^1.0.0, arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= + +asap@^2.0.0: + version "2.0.6" + resolved "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= + +asn1.js@^4.0.0: + version "4.10.1" + resolved "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" + integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +asn1@~0.2.3: + version "0.2.4" + resolved "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" + integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + +assert@^1.1.1: + version "1.4.1" + resolved "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" + integrity sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE= + dependencies: + util "0.10.3" + +assertion-error@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" + integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + +async-each@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" + integrity sha1-GdOGodntxufByF04iu28xW0zYC0= + +async-limiter@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" + integrity sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg== + +async@1.x, async@^1.5.2: + version "1.5.2" + resolved "http://registry.npmjs.org/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= + +async@^2.0.0, async@^2.5.0, async@^2.6.1: + version "2.6.1" + resolved "https://registry.npmjs.org/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610" + integrity sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ== + dependencies: + lodash "^4.17.10" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + +atob@^2.1.1: + version "2.1.2" + resolved "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + +aws4@^1.8.0: + version "1.8.0" + resolved "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" + integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== + +babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: + version "6.26.0" + resolved "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= + dependencies: + chalk "^1.1.3" + esutils "^2.0.2" + js-tokens "^3.0.2" + +babel-generator@^6.18.0: + version "6.26.1" + resolved "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" + integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA== + dependencies: + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + detect-indent "^4.0.0" + jsesc "^1.3.0" + lodash "^4.17.4" + source-map "^0.5.7" + trim-right "^1.0.1" + +babel-messages@^6.23.0: + version "6.23.0" + resolved "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4= + dependencies: + babel-runtime "^6.22.0" + +babel-runtime@^6.0.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: + version "6.26.0" + resolved "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + +babel-template@^6.16.0: + version "6.26.0" + resolved "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" + integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI= + dependencies: + babel-runtime "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + lodash "^4.17.4" + +babel-traverse@^6.18.0, babel-traverse@^6.26.0: + version "6.26.0" + resolved "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" + integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4= + dependencies: + babel-code-frame "^6.26.0" + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + debug "^2.6.8" + globals "^9.18.0" + invariant "^2.2.2" + lodash "^4.17.4" + +babel-types@^6.18.0, babel-types@^6.26.0: + version "6.26.0" + resolved "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" + integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= + dependencies: + babel-runtime "^6.26.0" + esutils "^2.0.2" + lodash "^4.17.4" + to-fast-properties "^1.0.3" + +babylon@^6.18.0: + version "6.18.0" + resolved "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== + +backo2@1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" + integrity sha1-MasayLEpNjRj41s+u2n038+6eUc= + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + +ban-sensitive-files@1.9.2: + version "1.9.2" + resolved "https://registry.npmjs.org/ban-sensitive-files/-/ban-sensitive-files-1.9.2.tgz#ca38081c825df2eea45174904972192568bfc767" + integrity sha512-8dlYLybLhAKvd2fGoDd2zskdbO8pm/FKxTwy+iA5mqq4bKovZNM4xNAzYWbttW9yjbxTz1O3SN+cyUx3LEG5CQ== + dependencies: + bluebird "3.5.1" + check-more-types "2.24.0" + debug "3.1.0" + ggit "2.4.2" + lazy-ass "1.6.0" + pluralize "7.0.0" + ramda "0.25.0" + update-notifier "2.3.0" + +base64-arraybuffer@0.1.5: + version "0.1.5" + resolved "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8" + integrity sha1-c5JncZI7Whl0etZmqlzUv5xunOg= + +base64-js@^1.0.2: + version "1.3.0" + resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3" + integrity sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw== + +base64id@1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz#47688cb99bb6804f0e06d3e763b1c32e57d8e6b6" + integrity sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY= + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.npmjs.org/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +batch@0.6.1: + version "0.6.1" + resolved "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" + integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY= + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + dependencies: + tweetnacl "^0.14.3" + +beeper@^1.0.0: + version "1.1.1" + resolved "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz#e6d5ea8c5dad001304a70b22638447f69cb2f809" + integrity sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak= + +better-assert@~1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522" + integrity sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI= + dependencies: + callsite "1.0.0" + +big.js@^3.1.3: + version "3.2.0" + resolved "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" + integrity sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q== + +binary-extensions@^1.0.0: + version "1.12.0" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.12.0.tgz#c2d780f53d45bba8317a8902d4ceeaf3a6385b14" + integrity sha512-DYWGk01lDcxeS/K9IHPGWfT8PsJmbXRtRd2Sx72Tnb8pcYZQFF1oSDb8hJtS1vhp212q1Rzi5dUf9+nq0o9UIg== + +bl@^1.0.0: + version "1.2.2" + resolved "http://registry.npmjs.org/bl/-/bl-1.2.2.tgz#a160911717103c07410cef63ef51b397c025af9c" + integrity sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA== + dependencies: + readable-stream "^2.3.5" + safe-buffer "^5.1.1" + +blob@0.0.4: + version "0.0.4" + resolved "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz#bcf13052ca54463f30f9fc7e95b9a47630a94921" + integrity sha1-vPEwUspURj8w+fx+lbmkdjCpSSE= + +bluebird@3.5.1: + version "3.5.1" + resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" + integrity sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA== + +bluebird@^3.3.0, bluebird@^3.5.1, bluebird@^3.5.2: + version "3.5.2" + resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.5.2.tgz#1be0908e054a751754549c270489c1505d4ab15a" + integrity sha512-dhHTWMI7kMx5whMQntl7Vr9C6BvV10lFXDAasnqnrMYhXVCzzk6IO9Fo2L75jXHT07WrOngL1WDXOp+yYS91Yg== + +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: + version "4.11.8" + resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" + integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== + +body-parser@1.18.3, body-parser@^1.16.1: + version "1.18.3" + resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz#5b292198ffdd553b3a0f20ded0592b956955c8b4" + integrity sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ= + dependencies: + bytes "3.0.0" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.2" + http-errors "~1.6.3" + iconv-lite "0.4.23" + on-finished "~2.3.0" + qs "6.5.2" + raw-body "2.3.3" + type-is "~1.6.16" + +bonjour@^3.5.0: + version "3.5.0" + resolved "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" + integrity sha1-jokKGD2O6aI5OzhExpGkK897yfU= + dependencies: + array-flatten "^2.1.0" + deep-equal "^1.0.1" + dns-equal "^1.0.0" + dns-txt "^2.0.2" + multicast-dns "^6.0.1" + multicast-dns-service-types "^1.1.0" + +boolbase@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= + +boxen@^1.2.1: + version "1.3.0" + resolved "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" + integrity sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw== + dependencies: + ansi-align "^2.0.0" + camelcase "^4.0.0" + chalk "^2.0.1" + cli-boxes "^1.0.0" + string-width "^2.0.0" + term-size "^1.2.0" + widest-line "^2.0.0" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^0.1.2: + version "0.1.5" + resolved "https://registry.npmjs.org/braces/-/braces-0.1.5.tgz#c085711085291d8b75fdd74eab0f8597280711e6" + integrity sha1-wIVxEIUpHYt1/ddOqw+FlygHEeY= + dependencies: + expand-range "^0.1.0" + +braces@^2.3.0, braces@^2.3.1: + version "2.3.2" + resolved "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +brorand@^1.0.1: + version "1.1.0" + resolved "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= + +browser-stdout@1.3.1: + version "1.3.1" + resolved "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" + integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== + +browserify-aes@^1.0.0, browserify-aes@^1.0.4: + version "1.2.0" + resolved "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +browserify-cipher@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +browserify-rsa@^4.0.0: + version "4.0.1" + resolved "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" + integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ= + dependencies: + bn.js "^4.1.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.0.4" + resolved "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" + integrity sha1-qk62jl17ZYuqa/alfmMMvXqT0pg= + dependencies: + bn.js "^4.1.1" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.2" + elliptic "^6.0.0" + inherits "^2.0.1" + parse-asn1 "^5.0.0" + +browserify-versionify@^1.0.6: + version "1.0.6" + resolved "https://registry.npmjs.org/browserify-versionify/-/browserify-versionify-1.0.6.tgz#ab2dc61d6a119e627bec487598d1983b7fdb275e" + integrity sha1-qy3GHWoRnmJ77Eh1mNGYO3/bJ14= + dependencies: + find-root "^0.1.1" + through2 "0.6.3" + +browserify-zlib@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== + dependencies: + pako "~1.0.5" + +buffer-alloc-unsafe@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" + integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== + +buffer-alloc@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" + integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== + dependencies: + buffer-alloc-unsafe "^1.1.0" + buffer-fill "^1.0.0" + +buffer-fill@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" + integrity sha1-+PeLdniYiO858gXNY39o5wISKyw= + +buffer-from@^1.0.0, buffer-from@^1.1.0: + version "1.1.1" + resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + +buffer-indexof@^1.0.0: + version "1.1.1" + resolved "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" + integrity sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g== + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= + +buffer@^4.3.0: + version "4.9.1" + resolved "http://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" + integrity sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg= + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +builtin-modules@^1.0.0, builtin-modules@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" + integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= + +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= + +cacache@^10.0.4: + version "10.0.4" + resolved "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz#6452367999eff9d4188aefd9a14e9d7c6a263460" + integrity sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA== + dependencies: + bluebird "^3.5.1" + chownr "^1.0.1" + glob "^7.1.2" + graceful-fs "^4.1.11" + lru-cache "^4.1.1" + mississippi "^2.0.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.2" + ssri "^5.2.4" + unique-filename "^1.1.0" + y18n "^4.0.0" + +cacache@^11.2.0: + version "11.2.0" + resolved "https://registry.npmjs.org/cacache/-/cacache-11.2.0.tgz#617bdc0b02844af56310e411c0878941d5739965" + integrity sha512-IFWl6lfK6wSeYCHUXh+N1lY72UDrpyrYQJNIVQf48paDuWbv5RbAtJYf/4gUQFObTCHZwdZ5sI8Iw7nqwP6nlQ== + dependencies: + bluebird "^3.5.1" + chownr "^1.0.1" + figgy-pudding "^3.1.0" + glob "^7.1.2" + graceful-fs "^4.1.11" + lru-cache "^4.1.3" + mississippi "^3.0.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.2" + ssri "^6.0.0" + unique-filename "^1.1.0" + y18n "^4.0.0" + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +call-me-maybe@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" + integrity sha1-JtII6onje1y95gJQoV8DHBak1ms= + +callsite@1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20" + integrity sha1-KAOY5dZkvXQDi28JBRU+borxvCA= + +camel-case@3.0.x: + version "3.0.0" + resolved "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73" + integrity sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M= + dependencies: + no-case "^2.2.0" + upper-case "^1.1.1" + +camelcase-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" + integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc= + dependencies: + camelcase "^2.0.0" + map-obj "^1.0.0" + +camelcase@^2.0.0: + version "2.1.1" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" + integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= + +camelcase@^4.0.0, camelcase@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= + +capture-stack-trace@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d" + integrity sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw== + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + +chai@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz#760aa72cf20e3795e84b12877ce0e83737aa29e5" + integrity sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw== + dependencies: + assertion-error "^1.1.0" + check-error "^1.0.2" + deep-eql "^3.0.1" + get-func-name "^2.0.0" + pathval "^1.1.0" + type-detect "^4.0.5" + +chalk@2.4.1, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4.1: + version "2.4.1" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" + integrity sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: + version "1.1.3" + resolved "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + +chdir-promise@0.6.2: + version "0.6.2" + resolved "https://registry.npmjs.org/chdir-promise/-/chdir-promise-0.6.2.tgz#d4cfa0a96a112a8149341b69e2866d162f0e2dbd" + integrity sha512-EG5MutQt4qTxoQPfBtPCfU1A/MqborgaO66xrPSD/dRTB40OLN0wy+YAo5ZAw7DawhtCPdZHAdQ206fyWkhoiw== + dependencies: + bluebird "^3.5.1" + check-more-types "2.24.0" + debug "3.1.0" + lazy-ass "1.6.0" + +check-error@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" + integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= + +check-more-types@2.24.0: + version "2.24.0" + resolved "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz#1420ffb10fd444dcfc79b43891bbfffd32a84600" + integrity sha1-FCD/sQ/URNz8ebQ4kbv//TKoRgA= + +chokidar@^2.0.0, chokidar@^2.0.2, chokidar@^2.0.3: + version "2.0.4" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz#356ff4e2b0e8e43e322d18a372460bbcf3accd26" + integrity sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ== + dependencies: + anymatch "^2.0.0" + async-each "^1.0.0" + braces "^2.3.0" + glob-parent "^3.1.0" + inherits "^2.0.1" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + lodash.debounce "^4.0.8" + normalize-path "^2.1.1" + path-is-absolute "^1.0.0" + readdirp "^2.0.0" + upath "^1.0.5" + optionalDependencies: + fsevents "^1.2.2" + +chownr@^1.0.1: + version "1.1.1" + resolved "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" + integrity sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g== + +chrome-trace-event@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz#45a91bd2c20c9411f0963b5aaeb9a1b95e09cc48" + integrity sha512-xDbVgyfDTT2piup/h8dK/y4QZfJRSa73bw1WZ8b4XM1o7fsFubUVGYcE+1ANtOzJJELGpYoG2961z0Z6OAld9A== + dependencies: + tslib "^1.9.0" + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +circular-json@^0.5.5: + version "0.5.7" + resolved "https://registry.npmjs.org/circular-json/-/circular-json-0.5.7.tgz#b8be478d72ea58c7eeda26bf1cf1fba43d188842" + integrity sha512-/pXoV1JA847qRKPrHbBK6YIBGFF8GOP4wzSgUOA7q0ew0vAv0iJswP+2/nZQ9uzA3Azi7eTrg9L2yzXc/7ZMIA== + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +clean-css@4.2.x: + version "4.2.1" + resolved "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz#2d411ef76b8569b6d0c84068dabe85b0aa5e5c17" + integrity sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g== + dependencies: + source-map "~0.6.0" + +cli-boxes@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" + integrity sha1-T6kXw+WclKAEzWH47lCdplFocUM= + +cli-cursor@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" + integrity sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc= + dependencies: + restore-cursor "^1.0.1" + +cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= + dependencies: + restore-cursor "^2.0.0" + +cli-table@0.3.1: + version "0.3.1" + resolved "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz#f53b05266a8b1a0b934b3d0821e6e2dc5914ae23" + integrity sha1-9TsFJmqLGguTSz0IIebi3FkUriM= + dependencies: + colors "1.0.3" + +cli-width@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" + integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= + +cliui@^4.0.0: + version "4.1.0" + resolved "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" + integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ== + dependencies: + string-width "^2.1.1" + strip-ansi "^4.0.0" + wrap-ansi "^2.0.0" + +clone-stats@^0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1" + integrity sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE= + +clone@^1.0.0: + version "1.0.4" + resolved "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.npmjs.org/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +color-support@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" + integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== + +colors@1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" + integrity sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs= + +colors@1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" + integrity sha1-FopHAXVran9RoSzgyXv6KMCE7WM= + +colors@^1.1.0: + version "1.3.2" + resolved "https://registry.npmjs.org/colors/-/colors-1.3.2.tgz#2df8ff573dfbf255af562f8ce7181d6b971a359b" + integrity sha512-rhP0JSBGYvpcNQj4s5AdShMeE5ahMop96cTeDl/v9qQQm2fYClE2QXZRi8wLzc+GmXSxdIqqbOIAhyObEXDbfQ== + +combine-lists@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/combine-lists/-/combine-lists-1.0.1.tgz#458c07e09e0d900fc28b70a3fec2dacd1d2cb7f6" + integrity sha1-RYwH4J4NkA/Ci3Cj/sLazR0st/Y= + dependencies: + lodash "^4.5.0" + +combined-stream@1.0.6: + version "1.0.6" + resolved "http://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818" + integrity sha1-cj599ugBrFYTETp+RFqbactjKBg= + dependencies: + delayed-stream "~1.0.0" + +combined-stream@~1.0.6: + version "1.0.7" + resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz#2d1d24317afb8abe95d6d2c0b07b57813539d828" + integrity sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w== + dependencies: + delayed-stream "~1.0.0" + +commander@2.12.2: + version "2.12.2" + resolved "https://registry.npmjs.org/commander/-/commander-2.12.2.tgz#0f5946c427ed9ec0d91a46bb9def53e54650e555" + integrity sha512-BFnaq5ZOGcDN7FlrtBT4xxkgIToalIIxwjxLWVJ8bGTpe1LroqMiqQXdA7ygc7CRvaYS+9zfPGFnJqFSayx+AA== + +commander@2.15.1: + version "2.15.1" + resolved "http://registry.npmjs.org/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" + integrity sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag== + +commander@2.17.x, commander@~2.17.1: + version "2.17.1" + resolved "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" + integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg== + +commander@^2.12.1, commander@^2.15.1: + version "2.19.0" + resolved "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" + integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== + +commander@~2.13.0: + version "2.13.0" + resolved "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" + integrity sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + +compare-versions@^3.2.1: + version "3.4.0" + resolved "https://registry.npmjs.org/compare-versions/-/compare-versions-3.4.0.tgz#e0747df5c9cb7f054d6d3dc3e1dbc444f9e92b26" + integrity sha512-tK69D7oNXXqUW3ZNo/z7NXTEz22TCF0pTE+YF9cxvaAM9XnkLo1fV621xCLrRR6aevJlKxExkss0vWqUCUpqdg== + +component-bind@1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" + integrity sha1-AMYIq33Nk4l8AAllGx06jh5zu9E= + +component-emitter@1.2.1, component-emitter@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" + integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= + +component-inherit@0.0.3: + version "0.0.3" + resolved "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" + integrity sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM= + +compressible@~2.0.14: + version "2.0.15" + resolved "https://registry.npmjs.org/compressible/-/compressible-2.0.15.tgz#857a9ab0a7e5a07d8d837ed43fe2defff64fe212" + integrity sha512-4aE67DL33dSW9gw4CI2H/yTxqHLNcxp0yS6jB+4h+wr3e43+1z7vm0HU9qXOH8j+qjKuL8+UtkOxYQSMq60Ylw== + dependencies: + mime-db ">= 1.36.0 < 2" + +compression@^1.5.2: + version "1.7.3" + resolved "https://registry.npmjs.org/compression/-/compression-1.7.3.tgz#27e0e176aaf260f7f2c2813c3e440adb9f1993db" + integrity sha512-HSjyBG5N1Nnz7tF2+O7A9XUhyjru71/fwgNb7oIsEVHR0WShfs2tIS/EySLgiTe98aOK18YDlMXpzjCXY/n9mg== + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.14" + debug "2.6.9" + on-headers "~1.0.1" + safe-buffer "5.1.2" + vary "~1.1.2" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +concat-stream@1.6.2, concat-stream@^1.5.0, concat-stream@^1.5.2: + version "1.6.2" + resolved "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +concat-with-sourcemaps@^1.0.5: + version "1.1.0" + resolved "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz#d4ea93f05ae25790951b99e7b3b09e3908a4082e" + integrity sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg== + dependencies: + source-map "^0.6.1" + +configstore@^3.0.0: + version "3.1.2" + resolved "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz#c6f25defaeef26df12dd33414b001fe81a543f8f" + integrity sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw== + dependencies: + dot-prop "^4.1.0" + graceful-fs "^4.1.2" + make-dir "^1.0.0" + unique-string "^1.0.0" + write-file-atomic "^2.0.0" + xdg-basedir "^3.0.0" + +connect-history-api-fallback@^1.3.0: + version "1.5.0" + resolved "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz#b06873934bc5e344fef611a196a6faae0aee015a" + integrity sha1-sGhzk0vF40T+9hGhlqb6rgruAVo= + +connect@^3.6.0: + version "3.6.6" + resolved "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz#09eff6c55af7236e137135a72574858b6786f524" + integrity sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ= + dependencies: + debug "2.6.9" + finalhandler "1.1.0" + parseurl "~1.3.2" + utils-merge "1.0.1" + +console-browserify@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" + integrity sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA= + dependencies: + date-now "^0.1.4" + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= + +constants-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= + +content-disposition@0.5.2: + version "0.5.2" + resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" + integrity sha1-DPaLud318r55YcOoUXjLhdunjLQ= + +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + +convert-source-map@^1.5.0: + version "1.6.0" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" + integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A== + dependencies: + safe-buffer "~5.1.1" + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= + +cookie@0.3.1: + version "0.3.1" + resolved "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" + integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s= + +copy-concurrently@^1.0.0: + version "1.0.5" + resolved "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" + integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== + dependencies: + aproba "^1.1.1" + fs-write-stream-atomic "^1.0.8" + iferr "^0.1.5" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.0" + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + +core-js@^2.2.0, core-js@^2.4.0: + version "2.5.7" + resolved "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz#f972608ff0cead68b841a16a932d0b183791814e" + integrity sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw== + +core-util-is@1.0.2, core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +cp-sugar@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/cp-sugar/-/cp-sugar-1.0.0.tgz#1c26f9bdca1c03cf6af744a655239ff931ccab6f" + integrity sha1-HCb5vcocA89q90SmVSOf+THMq28= + dependencies: + cross-spawn-async "^2.1.6" + pinkie-promise "^2.0.0" + promisify-event "^1.0.0" + shell-quote "^1.4.3" + +create-ecdh@^4.0.0: + version "4.0.3" + resolved "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" + integrity sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw== + dependencies: + bn.js "^4.1.0" + elliptic "^6.0.0" + +create-error-class@^3.0.0: + version "3.0.2" + resolved "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" + integrity sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y= + dependencies: + capture-stack-trace "^1.0.0" + +create-hash@^1.1.0, create-hash@^1.1.2: + version "1.2.0" + resolved "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: + version "1.1.7" + resolved "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +cross-spawn-async@^2.1.6: + version "2.2.5" + resolved "https://registry.npmjs.org/cross-spawn-async/-/cross-spawn-async-2.2.5.tgz#845ff0c0834a3ded9d160daca6d390906bb288cc" + integrity sha1-hF/wwINKPe2dFg2sptOQkGuyiMw= + dependencies: + lru-cache "^4.0.0" + which "^1.2.8" + +cross-spawn@^5.0.1: + version "5.1.0" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^6.0.0, cross-spawn@^6.0.5: + version "6.0.5" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +crypto-browserify@^3.11.0: + version "3.12.0" + resolved "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + randomfill "^1.0.3" + +crypto-random-string@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" + integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= + +css-select@^1.1.0: + version "1.2.0" + resolved "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" + integrity sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg= + dependencies: + boolbase "~1.0.0" + css-what "2.1" + domutils "1.5.1" + nth-check "~1.0.1" + +css-what@2.1: + version "2.1.0" + resolved "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz#9467d032c38cfaefb9f2d79501253062f87fa1bd" + integrity sha1-lGfQMsOM+u+58teVASUwYvh/ob0= + +currently-unhandled@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" + integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= + dependencies: + array-find-index "^1.0.1" + +custom-event@~1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425" + integrity sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU= + +cyclist@~0.2.2: + version "0.2.2" + resolved "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" + integrity sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA= + +d3-helpers@0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/d3-helpers/-/d3-helpers-0.3.0.tgz#4b31dce4a2121a77336384574d893fbed5fb293d" + integrity sha1-SzHc5KISGnczY4RXTYk/vtX7KT0= + +d@1: + version "1.0.0" + resolved "https://registry.npmjs.org/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f" + integrity sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8= + dependencies: + es5-ext "^0.10.9" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= + dependencies: + assert-plus "^1.0.0" + +date-format@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/date-format/-/date-format-1.2.0.tgz#615e828e233dd1ab9bb9ae0950e0ceccfa6ecad8" + integrity sha1-YV6CjiM90aubua4JUODOzPpuytg= + +date-now@^0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" + integrity sha1-6vQ5/U1ISK105cx9vvIAZyueNFs= + +dateformat@^1.0.11: + version "1.0.12" + resolved "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz#9f124b67594c937ff706932e4a642cca8dbbfee9" + integrity sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk= + dependencies: + get-stdin "^4.0.1" + meow "^3.3.0" + +debug@2.6.9, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.6, debug@^2.6.8: + version "2.6.9" + resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@3.1.0, debug@=3.1.0, debug@~3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== + dependencies: + ms "2.0.0" + +debug@^3.1.0: + version "3.2.6" + resolved "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" + integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== + dependencies: + ms "^2.1.1" + +decamelize@^1.1.2: + version "1.2.0" + resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + +decamelize@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/decamelize/-/decamelize-2.0.0.tgz#656d7bbc8094c4c788ea53c5840908c9c7d063c7" + integrity sha512-Ikpp5scV3MSYxY39ymh45ZLEecsTdv/Xj2CaQfI8RLMuwi7XvjX9H/fhraiSuU+C5w5NTDu4ZU72xNiZnurBPg== + dependencies: + xregexp "4.0.0" + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + +deep-eql@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" + integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== + dependencies: + type-detect "^4.0.0" + +deep-equal@^1.0.1, deep-equal@~1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" + integrity sha1-9dJgKStmDghO/0zbyfCK0yR0SLU= + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= + +default-gateway@^2.6.0: + version "2.7.2" + resolved "https://registry.npmjs.org/default-gateway/-/default-gateway-2.7.2.tgz#b7ef339e5e024b045467af403d50348db4642d0f" + integrity sha512-lAc4i9QJR0YHSDFdzeBQKfZ1SRDG3hsJNEkrpcZa8QhBfidLAilT60BDEIVUUGqosFp425KOgB3uYqcnQrWafQ== + dependencies: + execa "^0.10.0" + ip-regex "^2.1.0" + +default-require-extensions@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz#f5f8fbb18a7d6d50b21f641f649ebb522cfe24f7" + integrity sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc= + dependencies: + strip-bom "^3.0.0" + +define-properties@^1.1.2: + version "1.1.3" + resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +defined@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" + integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= + +del@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/del/-/del-3.0.0.tgz#53ecf699ffcbcb39637691ab13baf160819766e5" + integrity sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU= + dependencies: + globby "^6.1.0" + is-path-cwd "^1.0.0" + is-path-in-cwd "^1.0.0" + p-map "^1.1.1" + pify "^3.0.0" + rimraf "^2.2.8" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + +des.js@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" + integrity sha1-wHTS4qpqipoH29YfmhXCzYPsjsw= + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= + +detect-indent@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" + integrity sha1-920GQ1LN9Docts5hnE7jqUdd4gg= + dependencies: + repeating "^2.0.0" + +detect-libc@^1.0.2: + version "1.0.3" + resolved "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= + +detect-node@^2.0.3: + version "2.0.4" + resolved "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c" + integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw== + +di@^0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c" + integrity sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw= + +diff@3.5.0, diff@^3.1.0, diff@^3.2.0, diff@^3.5.0: + version "3.5.0" + resolved "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" + integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== + +diffie-hellman@^5.0.0: + version "5.0.3" + resolved "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + +dir-glob@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz#0b205d2b6aef98238ca286598a8204d29d0a0034" + integrity sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag== + dependencies: + arrify "^1.0.1" + path-type "^3.0.0" + +dns-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" + integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0= + +dns-packet@^1.3.1: + version "1.3.1" + resolved "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz#12aa426981075be500b910eedcd0b47dd7deda5a" + integrity sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg== + dependencies: + ip "^1.1.0" + safe-buffer "^5.0.1" + +dns-txt@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" + integrity sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY= + dependencies: + buffer-indexof "^1.0.0" + +dom-converter@~0.2: + version "0.2.0" + resolved "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" + integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== + dependencies: + utila "~0.4" + +dom-serialize@^2.2.0: + version "2.2.1" + resolved "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz#562ae8999f44be5ea3076f5419dcd59eb43ac95b" + integrity sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs= + dependencies: + custom-event "~1.0.0" + ent "~2.2.0" + extend "^3.0.0" + void-elements "^2.0.0" + +dom-serializer@0: + version "0.1.0" + resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82" + integrity sha1-BzxpdUbOB4DOI75KKOKT5AvDDII= + dependencies: + domelementtype "~1.1.1" + entities "~1.1.1" + +domain-browser@^1.1.1: + version "1.2.0" + resolved "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== + +domelementtype@1: + version "1.3.0" + resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz#b17aed82e8ab59e52dd9c19b1756e0fc187204c2" + integrity sha1-sXrtguirWeUt2cGbF1bg/BhyBMI= + +domelementtype@~1.1.1: + version "1.1.3" + resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b" + integrity sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs= + +domhandler@2.1: + version "2.1.0" + resolved "https://registry.npmjs.org/domhandler/-/domhandler-2.1.0.tgz#d2646f5e57f6c3bab11cf6cb05d3c0acf7412594" + integrity sha1-0mRvXlf2w7qxHPbLBdPArPdBJZQ= + dependencies: + domelementtype "1" + +domutils@1.1: + version "1.1.6" + resolved "https://registry.npmjs.org/domutils/-/domutils-1.1.6.tgz#bddc3de099b9a2efacc51c623f28f416ecc57485" + integrity sha1-vdw94Jm5ou+sxRxiPyj0FuzFdIU= + dependencies: + domelementtype "1" + +domutils@1.5.1: + version "1.5.1" + resolved "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" + integrity sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8= + dependencies: + dom-serializer "0" + domelementtype "1" + +dot-prop@^4.1.0: + version "4.2.0" + resolved "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" + integrity sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ== + dependencies: + is-obj "^1.0.0" + +duplexer2@0.0.2: + version "0.0.2" + resolved "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db" + integrity sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds= + dependencies: + readable-stream "~1.1.9" + +duplexer3@^0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" + integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= + +duplexify@^3.4.2, duplexify@^3.4.5, duplexify@^3.6.0: + version "3.6.0" + resolved "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz#592903f5d80b38d037220541264d69a198fb3410" + integrity sha512-fO3Di4tBKJpYTFHAxTU00BcfWMY9w24r/x21a6rZRbsD/ToUgGxsMbiGRmB7uVAXeGKXD9MwiLZa5E97EVgIRQ== + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +easeljs@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/easeljs/-/easeljs-1.0.2.tgz#68fdcc69d0f217394e2ebf51ae047428a81240de" + integrity sha512-PQTsiud32vrUIqZCbynjOJjCzoEp0xH+MRusRCdsZ1MzL4LCE2vp4Sa5cr6aShB3mK4vMZ8LFPnts4xuFhjEmg== + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + +elegant-spinner@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e" + integrity sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4= + +elegant-status@1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/elegant-status/-/elegant-status-1.1.0.tgz#41ef4a5f2d03642983babb4f64a4b576b1155215" + integrity sha1-Qe9KXy0DZCmDurtPZKS1drEVUhU= + dependencies: + chalk "^1.1.1" + elegant-spinner "^1.0.1" + log-update "^1.0.2" + os-family "^1.0.0" + +elliptic@^6.0.0: + version "6.4.1" + resolved "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz#c2d0b7776911b86722c632c3c06c60f2f819939a" + integrity sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ== + dependencies: + bn.js "^4.4.0" + brorand "^1.0.1" + hash.js "^1.0.0" + hmac-drbg "^1.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.0" + +emojis-list@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" + integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= + +encodeurl@~1.0.1, encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + +end-of-stream@^1.0.0, end-of-stream@^1.1.0: + version "1.4.1" + resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" + integrity sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q== + dependencies: + once "^1.4.0" + +engine.io-client@~3.2.0: + version "3.2.1" + resolved "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.2.1.tgz#6f54c0475de487158a1a7c77d10178708b6add36" + integrity sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw== + dependencies: + component-emitter "1.2.1" + component-inherit "0.0.3" + debug "~3.1.0" + engine.io-parser "~2.1.1" + has-cors "1.1.0" + indexof "0.0.1" + parseqs "0.0.5" + parseuri "0.0.5" + ws "~3.3.1" + xmlhttprequest-ssl "~1.5.4" + yeast "0.1.2" + +engine.io-parser@~2.1.0, engine.io-parser@~2.1.1: + version "2.1.2" + resolved "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.2.tgz#4c0f4cff79aaeecbbdcfdea66a823c6085409196" + integrity sha512-dInLFzr80RijZ1rGpx1+56/uFoH7/7InhH3kZt+Ms6hT8tNx3NGW/WNSA/f8As1WkOfkuyb3tnRyuXGxusclMw== + dependencies: + after "0.8.2" + arraybuffer.slice "~0.0.7" + base64-arraybuffer "0.1.5" + blob "0.0.4" + has-binary2 "~1.0.2" + +engine.io@~3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/engine.io/-/engine.io-3.2.0.tgz#54332506f42f2edc71690d2f2a42349359f3bf7d" + integrity sha512-mRbgmAtQ4GAlKwuPnnAvXXwdPhEx+jkc0OBCLrXuD/CRvwNK3AxRSnqK4FSqmAMRRHryVJP8TopOvmEaA64fKw== + dependencies: + accepts "~1.3.4" + base64id "1.0.0" + cookie "0.3.1" + debug "~3.1.0" + engine.io-parser "~2.1.0" + ws "~3.3.1" + +enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f" + integrity sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng== + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.4.0" + tapable "^1.0.0" + +ent@~2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d" + integrity sha1-6WQhkyWiHQX0RGai9obtbOX13R0= + +entities@~1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" + integrity sha1-blwtClYhtdra7O+AuQ7ftc13cvA= + +errno@^0.1.3, errno@~0.1.7: + version "0.1.7" + resolved "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" + integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg== + dependencies: + prr "~1.0.1" + +error-ex@^1.2.0, error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.5.0, es-abstract@^1.5.1: + version "1.12.0" + resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz#9dbbdd27c6856f0001421ca18782d786bf8a6165" + integrity sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA== + dependencies: + es-to-primitive "^1.1.1" + function-bind "^1.1.1" + has "^1.0.1" + is-callable "^1.1.3" + is-regex "^1.0.4" + +es-to-primitive@^1.1.1: + version "1.2.0" + resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" + integrity sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14: + version "0.10.46" + resolved "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.46.tgz#efd99f67c5a7ec789baa3daa7f79870388f7f572" + integrity sha512-24XxRvJXNFwEMpJb3nOkiRJKRoupmjYmOPVlI65Qy2SrtxwOTB+g6ODjBKOtwEHbYrhWRty9xxOWLNdClT2djw== + dependencies: + es6-iterator "~2.0.3" + es6-symbol "~3.1.1" + next-tick "1" + +es5-shim@~4.5.8: + version "4.5.12" + resolved "https://registry.npmjs.org/es5-shim/-/es5-shim-4.5.12.tgz#508c13dda1c87dd3df1b50e69e7b96b82149b649" + integrity sha512-MjoCAHE6P2Dirme70Cxd9i2Ng8rhXiaVSsxDWdSwimfLERJL/ypR2ed2rTYkeeYrMk8gq281dzKLiGcdrmc8qg== + +es6-iterator@~2.0.1, es6-iterator@~2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" + integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= + dependencies: + d "1" + es5-ext "^0.10.35" + es6-symbol "^3.1.1" + +es6-map@^0.1.5: + version "0.1.5" + resolved "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0" + integrity sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA= + dependencies: + d "1" + es5-ext "~0.10.14" + es6-iterator "~2.0.1" + es6-set "~0.1.5" + es6-symbol "~3.1.1" + event-emitter "~0.3.5" + +es6-promise@^4.0.3: + version "4.2.5" + resolved "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.5.tgz#da6d0d5692efb461e082c14817fe2427d8f5d054" + integrity sha512-n6wvpdE43VFtJq+lUDYDBFUwV8TZbuGXLV4D6wKafg13ldznKsyEvatubnmUe31zcvelSzOHF+XbaT+Bl9ObDg== + +es6-set@~0.1.5: + version "0.1.5" + resolved "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1" + integrity sha1-0rPsXU2ADO2BjbU40ol02wpzzLE= + dependencies: + d "1" + es5-ext "~0.10.14" + es6-iterator "~2.0.1" + es6-symbol "3.1.1" + event-emitter "~0.3.5" + +es6-shim@~0.35.0: + version "0.35.3" + resolved "https://registry.npmjs.org/es6-shim/-/es6-shim-0.35.3.tgz#9bfb7363feffff87a6cdb6cd93e405ec3c4b6f26" + integrity sha1-m/tzY/7//4emzbbNk+QF7DxLbyY= + +es6-symbol@3.1.1, es6-symbol@^3.1.1, es6-symbol@~3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" + integrity sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc= + dependencies: + d "1" + es5-ext "~0.10.14" + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + +escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +escodegen@1.8.x: + version "1.8.1" + resolved "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018" + integrity sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg= + dependencies: + esprima "^2.7.1" + estraverse "^1.9.1" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.2.0" + +escodegen@^1.8.1: + version "1.11.0" + resolved "https://registry.npmjs.org/escodegen/-/escodegen-1.11.0.tgz#b27a9389481d5bfd5bec76f7bb1eb3f8f4556589" + integrity sha512-IeMV45ReixHS53K/OmfKAIztN/igDHzTJUhZM3k1jMhIZWjk45SMwAtBsEXiJp3vSPmTcu6CXn7mDvFHRN66fw== + dependencies: + esprima "^3.1.3" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + +eslint-scope@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz#50bf3071e9338bcdc43331794a0cb533f0136172" + integrity sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +esprima@2.7.x, esprima@^2.7.1: + version "2.7.3" + resolved "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" + integrity sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE= + +esprima@^3.1.3: + version "3.1.3" + resolved "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" + integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM= + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esrecurse@^4.1.0: + version "4.2.1" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" + integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== + dependencies: + estraverse "^4.1.0" + +estraverse@^1.9.1: + version "1.9.3" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" + integrity sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q= + +estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" + integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM= + +esutils@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs= + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + +event-emitter@~0.3.5: + version "0.3.5" + resolved "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" + integrity sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk= + dependencies: + d "1" + es5-ext "~0.10.14" + +eventemitter3@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz#090b4d6cdbd645ed10bf750d4b5407942d7ba163" + integrity sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA== + +events@^1.0.0, events@^1.0.2: + version "1.1.1" + resolved "http://registry.npmjs.org/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" + integrity sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ= + +eventsource@0.1.6: + version "0.1.6" + resolved "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz#0acede849ed7dd1ccc32c811bb11b944d4f29232" + integrity sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI= + dependencies: + original ">=0.0.5" + +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +execa@^0.10.0: + version "0.10.0" + resolved "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz#ff456a8f53f90f8eccc71a96d11bdfc7f082cb50" + integrity sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw== + dependencies: + cross-spawn "^6.0.0" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +execa@^0.7.0: + version "0.7.0" + resolved "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" + integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c= + dependencies: + cross-spawn "^5.0.1" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +exit-hook@^1.0.0: + version "1.1.1" + resolved "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" + integrity sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g= + +expand-braces@^0.1.1: + version "0.1.2" + resolved "https://registry.npmjs.org/expand-braces/-/expand-braces-0.1.2.tgz#488b1d1d2451cb3d3a6b192cfc030f44c5855fea" + integrity sha1-SIsdHSRRyz06axks/AMPRMWFX+o= + dependencies: + array-slice "^0.2.3" + array-unique "^0.2.1" + braces "^0.1.2" + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +expand-range@^0.1.0: + version "0.1.1" + resolved "https://registry.npmjs.org/expand-range/-/expand-range-0.1.1.tgz#4cb8eda0993ca56fa4f41fc42f3cbb4ccadff044" + integrity sha1-TLjtoJk8pW+k9B/ELzy7TMrf8EQ= + dependencies: + is-number "^0.1.1" + repeat-string "^0.2.2" + +express@^4.16.2: + version "4.16.4" + resolved "https://registry.npmjs.org/express/-/express-4.16.4.tgz#fddef61926109e24c515ea97fd2f1bdbf62df12e" + integrity sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg== + dependencies: + accepts "~1.3.5" + array-flatten "1.1.1" + body-parser "1.18.3" + content-disposition "0.5.2" + content-type "~1.0.4" + cookie "0.3.1" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~1.1.2" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.1.1" + fresh "0.5.2" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.2" + path-to-regexp "0.1.7" + proxy-addr "~2.0.4" + qs "6.5.2" + range-parser "~1.2.0" + safe-buffer "5.1.2" + send "0.16.2" + serve-static "1.13.2" + setprototypeof "1.1.0" + statuses "~1.4.0" + type-is "~1.6.16" + utils-merge "1.0.1" + vary "~1.1.2" + +extend-shallow@^1.1.2: + version "1.1.4" + resolved "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz#19d6bf94dfc09d76ba711f39b872d21ff4dd9071" + integrity sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE= + dependencies: + kind-of "^1.1.0" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extend@^3.0.0, extend@~3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +external-editor@^3.0.0: + version "3.0.3" + resolved "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz#5866db29a97826dbe4bf3afd24070ead9ea43a27" + integrity sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +extract-zip@^1.6.5: + version "1.6.7" + resolved "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz#a840b4b8af6403264c8db57f4f1a74333ef81fe9" + integrity sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k= + dependencies: + concat-stream "1.6.2" + debug "2.6.9" + mkdirp "0.5.1" + yauzl "2.4.1" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= + +falafel@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/falafel/-/falafel-2.1.0.tgz#96bb17761daba94f46d001738b3cedf3a67fe06c" + integrity sha1-lrsXdh2rqU9G0AFzizzt86Z/4Gw= + dependencies: + acorn "^5.0.0" + foreach "^2.0.5" + isarray "0.0.1" + object-keys "^1.0.6" + +fancy-log@^1.1.0: + version "1.3.2" + resolved "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.2.tgz#f41125e3d84f2e7d89a43d06d958c8f78be16be1" + integrity sha1-9BEl49hPLn2JpD0G2VjI94vha+E= + dependencies: + ansi-gray "^0.1.1" + color-support "^1.1.3" + time-stamp "^1.0.0" + +fast-deep-equal@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" + integrity sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ= + +fast-deep-equal@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" + integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= + +fast-glob@^2.0.2: + version "2.2.3" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.3.tgz#d09d378e9ef6b0076a0fa1ba7519d9d4d9699c28" + integrity sha512-NiX+JXjnx43RzvVFwRWfPKo4U+1BrK5pJPsHQdKMlLoFHrrGktXglQhHliSihWAq+m1z6fHk3uwGHrtRbS9vLA== + dependencies: + "@mrmlnc/readdir-enhanced" "^2.2.1" + "@nodelib/fs.stat" "^1.0.1" + glob-parent "^3.1.0" + is-glob "^4.0.0" + merge2 "^1.2.1" + micromatch "^3.1.10" + +fast-json-stable-stringify@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" + integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= + +fast-levenshtein@~2.0.4: + version "2.0.6" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + +faye-websocket@^0.10.0: + version "0.10.0" + resolved "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" + integrity sha1-TkkvjQTftviQA1B/btvy1QHnxvQ= + dependencies: + websocket-driver ">=0.5.1" + +faye-websocket@~0.11.0: + version "0.11.1" + resolved "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz#f0efe18c4f56e4f40afc7e06c719fd5ee6188f38" + integrity sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg= + dependencies: + websocket-driver ">=0.5.1" + +fd-slicer@~1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e65" + integrity sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU= + dependencies: + pend "~1.2.0" + +figgy-pudding@^3.1.0, figgy-pudding@^3.5.1: + version "3.5.1" + resolved "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" + integrity sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w== + +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= + dependencies: + escape-string-regexp "^1.0.5" + +fileset@^2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz#8e7548a96d3cc2327ee5e674168723a333bba2a0" + integrity sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA= + dependencies: + glob "^7.0.3" + minimatch "^3.0.3" + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +finalhandler@1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz#ce0b6855b45853e791b2fcc680046d88253dd7f5" + integrity sha1-zgtoVbRYU+eRsvzGgARtiCU91/U= + dependencies: + debug "2.6.9" + encodeurl "~1.0.1" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.2" + statuses "~1.3.1" + unpipe "~1.0.0" + +finalhandler@1.1.1: + version "1.1.1" + resolved "http://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105" + integrity sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.2" + statuses "~1.4.0" + unpipe "~1.0.0" + +find-cache-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f" + integrity sha1-kojj6ePMN0hxfTnq3hfPcfww7m8= + dependencies: + commondir "^1.0.1" + make-dir "^1.0.0" + pkg-dir "^2.0.0" + +find-cache-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.0.0.tgz#4c1faed59f45184530fb9d7fa123a4d04a98472d" + integrity sha512-LDUY6V1Xs5eFskUVYtIwatojt6+9xC9Chnlk/jYOOvn3FAFfSaWddxahDGyNHh0b2dMXa6YW2m0tk8TdVaXHlA== + dependencies: + commondir "^1.0.1" + make-dir "^1.0.0" + pkg-dir "^3.0.0" + +find-root@^0.1.1: + version "0.1.2" + resolved "https://registry.npmjs.org/find-root/-/find-root-0.1.2.tgz#98d2267cff1916ccaf2743b3a0eea81d79d7dcd1" + integrity sha1-mNImfP8ZFsyvJ0OzoO6oHXnX3NE= + +find-up@2.1.0, find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= + dependencies: + locate-path "^2.0.0" + +find-up@^1.0.0: + version "1.1.2" + resolved "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +flush-write-stream@^1.0.0: + version "1.0.3" + resolved "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz#c5d586ef38af6097650b49bc41b55fabb19f35bd" + integrity sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw== + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.4" + +follow-redirects@^1.0.0: + version "1.5.9" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.9.tgz#c9ed9d748b814a39535716e531b9196a845d89c6" + integrity sha512-Bh65EZI/RU8nx0wbYF9shkFZlqLP+6WT/5FnA3cE/djNSuKNHJEinGGZgu/cQEkeeb2GdFOgenAmn8qaqYke2w== + dependencies: + debug "=3.1.0" + +for-each@~0.3.3: + version "0.3.3" + resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + +foreach@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" + integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k= + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + +form-data@~2.3.2: + version "2.3.2" + resolved "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz#4970498be604c20c005d4f5c23aecd21d6b49099" + integrity sha1-SXBJi+YEwgwAXU9cI67NIda0kJk= + dependencies: + asynckit "^0.4.0" + combined-stream "1.0.6" + mime-types "^2.1.12" + +forwarded@~0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" + integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + dependencies: + map-cache "^0.2.2" + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + +from2@^2.1.0, from2@^2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" + integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.0" + +fs-access@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz#d6a87f262271cefebec30c553407fb995da8777a" + integrity sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o= + dependencies: + null-check "^1.0.0" + +fs-extra@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz#cd3ce5f7e7cb6145883fcae3191e9877f8587950" + integrity sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA= + dependencies: + graceful-fs "^4.1.2" + jsonfile "^2.1.0" + klaw "^1.0.0" + +fs-minipass@^1.2.5: + version "1.2.5" + resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" + integrity sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ== + dependencies: + minipass "^2.2.1" + +fs-write-stream-atomic@^1.0.8: + version "1.0.10" + resolved "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" + integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk= + dependencies: + graceful-fs "^4.1.2" + iferr "^0.1.5" + imurmurhash "^0.1.4" + readable-stream "1 || 2" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@^1.2.2: + version "1.2.4" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426" + integrity sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg== + dependencies: + nan "^2.9.2" + node-pre-gyp "^0.10.0" + +fstream-ignore@^1.0.0: + version "1.0.5" + resolved "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" + integrity sha1-nDHa40dnAY/h0kmyTa2mfQktoQU= + dependencies: + fstream "^1.0.0" + inherits "2" + minimatch "^3.0.0" + +fstream-npm@^1.0.7: + version "1.2.1" + resolved "https://registry.npmjs.org/fstream-npm/-/fstream-npm-1.2.1.tgz#08c4a452f789dcbac4c89a4563c902b2c862fd5b" + integrity sha512-iBHpm/LmD1qw0TlHMAqVd9rwdU6M+EHRUnPkXpRi5G/Hf0FIFH+oZFryodAU2MFNfGRh/CzhUFlMKV3pdeOTDw== + dependencies: + fstream-ignore "^1.0.0" + inherits "2" + +fstream@^1.0.0: + version "1.0.11" + resolved "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" + integrity sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE= + dependencies: + graceful-fs "^4.1.2" + inherits "~2.0.0" + mkdirp ">=0.5 0" + rimraf "2" + +function-bind@^1.0.2, function-bind@^1.1.1, function-bind@~1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +get-caller-file@^1.0.1: + version "1.0.3" + resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" + integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== + +get-func-name@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" + integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= + +get-stdin@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" + integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= + +get-stream@^3.0.0: + version "3.0.0" + resolved "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= + dependencies: + assert-plus "^1.0.0" + +ggit@2.4.2: + version "2.4.2" + resolved "https://registry.npmjs.org/ggit/-/ggit-2.4.2.tgz#38fbddfffd2faab98e29f8a15e12d59a6557abbc" + integrity sha512-4pltyhG4cjVT1Nqs9pq8Iykc/lTibc4LKRUAxszA9+OgwpfGhbsFgzhtyXwh5AbiWZrBa87nIHzyVGlJoT4nCw== + dependencies: + always-error "1.0.0" + bluebird "3.5.1" + chdir-promise "0.6.2" + check-more-types "2.24.0" + cli-table "0.3.1" + colors "1.1.2" + commander "2.12.2" + d3-helpers "0.3.0" + debug "3.1.0" + find-up "2.1.0" + glob "7.1.2" + lazy-ass "1.6.0" + lodash "4.17.4" + moment "2.19.3" + moment-timezone "0.5.14" + optimist "0.6.1" + pluralize "7.0.0" + q "2.0.3" + quote "0.4.0" + ramda "0.25.0" + semver "5.4.1" + +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob-to-regexp@^0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" + integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= + +glob@7.1.2: + version "7.1.2" + resolved "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" + integrity sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^5.0.15: + version "5.0.15" + resolved "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" + integrity sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E= + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "2 || 3" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@~7.1.2: + version "7.1.3" + resolved "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" + integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +global-dirs@^0.1.0: + version "0.1.1" + resolved "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" + integrity sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU= + dependencies: + ini "^1.3.4" + +global-modules-path@^2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/global-modules-path/-/global-modules-path-2.3.0.tgz#b0e2bac6beac39745f7db5c59d26a36a0b94f7dc" + integrity sha512-HchvMJNYh9dGSCy8pOQ2O8u/hoXaL+0XhnrwH0RyLiSXMMTl9W3N6KUU73+JFOg5PGjtzl6VZzUQsnrpm7Szag== + +globals@^11.1.0: + version "11.8.0" + resolved "https://registry.npmjs.org/globals/-/globals-11.8.0.tgz#c1ef45ee9bed6badf0663c5cb90e8d1adec1321d" + integrity sha512-io6LkyPVuzCHBSQV9fmOwxZkUk6nIaGmxheLDgmuFv89j0fm2aqDbIXKAGfzCMHqz3HLF2Zf8WSG6VqMh2qFmA== + +globals@^9.18.0: + version "9.18.0" + resolved "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" + integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== + +globby@8.0.1, globby@^8.0.1: + version "8.0.1" + resolved "https://registry.npmjs.org/globby/-/globby-8.0.1.tgz#b5ad48b8aa80b35b814fc1281ecc851f1d2b5b50" + integrity sha512-oMrYrJERnKBLXNLVTqhm3vPEdJ/b2ZE28xN4YARiix1NOIOBPEpOUnm844K1iu/BkphCaf2WNFwMszv8Soi1pw== + dependencies: + array-union "^1.0.1" + dir-glob "^2.0.0" + fast-glob "^2.0.2" + glob "^7.1.2" + ignore "^3.3.5" + pify "^3.0.0" + slash "^1.0.0" + +globby@^6.1.0: + version "6.1.0" + resolved "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" + integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw= + dependencies: + array-union "^1.0.1" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +glogg@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/glogg/-/glogg-1.0.1.tgz#dcf758e44789cc3f3d32c1f3562a3676e6a34810" + integrity sha512-ynYqXLoluBKf9XGR1gA59yEJisIL7YHEH4xr3ZziHB5/yl4qWfaK8Js9jGe6gBGCSCKVqiyO30WnRZADvemUNw== + dependencies: + sparkles "^1.0.0" + +glsl-inject-defines@^1.0.1: + version "1.0.3" + resolved "https://registry.npmjs.org/glsl-inject-defines/-/glsl-inject-defines-1.0.3.tgz#dd1aacc2c17fcb2bd3fc32411c6633d0d7b60fd4" + integrity sha1-3RqswsF/yyvT/DJBHGYz0Ne2D9Q= + dependencies: + glsl-token-inject-block "^1.0.0" + glsl-token-string "^1.0.1" + glsl-tokenizer "^2.0.2" + +glsl-resolve@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/glsl-resolve/-/glsl-resolve-0.0.1.tgz#894bef73910d792c81b5143180035d0a78af76d3" + integrity sha1-iUvvc5ENeSyBtRQxgANdCnivdtM= + dependencies: + resolve "^0.6.1" + xtend "^2.1.2" + +glsl-token-assignments@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/glsl-token-assignments/-/glsl-token-assignments-2.0.2.tgz#a5d82ab78499c2e8a6b83cb69495e6e665ce019f" + integrity sha1-pdgqt4SZwuimuDy2lJXm5mXOAZ8= + +glsl-token-defines@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/glsl-token-defines/-/glsl-token-defines-1.0.0.tgz#cb892aa959936231728470d4f74032489697fa9d" + integrity sha1-y4kqqVmTYjFyhHDU90AySJaX+p0= + dependencies: + glsl-tokenizer "^2.0.0" + +glsl-token-depth@^1.1.0, glsl-token-depth@^1.1.1: + version "1.1.2" + resolved "https://registry.npmjs.org/glsl-token-depth/-/glsl-token-depth-1.1.2.tgz#23c5e30ee2bd255884b4a28bc850b8f791e95d84" + integrity sha1-I8XjDuK9JViEtKKLyFC495HpXYQ= + +glsl-token-descope@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/glsl-token-descope/-/glsl-token-descope-1.0.2.tgz#0fc90ab326186b82f597b2e77dc9e21efcd32076" + integrity sha1-D8kKsyYYa4L1l7LnfcniHvzTIHY= + dependencies: + glsl-token-assignments "^2.0.0" + glsl-token-depth "^1.1.0" + glsl-token-properties "^1.0.0" + glsl-token-scope "^1.1.0" + +glsl-token-inject-block@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/glsl-token-inject-block/-/glsl-token-inject-block-1.1.0.tgz#e1015f5980c1091824adaa2625f1dfde8bd00034" + integrity sha1-4QFfWYDBCRgkraomJfHf3ovQADQ= + +glsl-token-properties@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/glsl-token-properties/-/glsl-token-properties-1.0.1.tgz#483dc3d839f0d4b5c6171d1591f249be53c28a9e" + integrity sha1-SD3D2Dnw1LXGFx0VkfJJvlPCip4= + +glsl-token-scope@^1.1.0, glsl-token-scope@^1.1.1: + version "1.1.2" + resolved "https://registry.npmjs.org/glsl-token-scope/-/glsl-token-scope-1.1.2.tgz#a1728e78df24444f9cb93fd18ef0f75503a643b1" + integrity sha1-oXKOeN8kRE+cuT/RjvD3VQOmQ7E= + +glsl-token-string@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/glsl-token-string/-/glsl-token-string-1.0.1.tgz#59441d2f857de7c3449c945666021ece358e48ec" + integrity sha1-WUQdL4V958NEnJRWZgIezjWOSOw= + +glsl-token-whitespace-trim@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/glsl-token-whitespace-trim/-/glsl-token-whitespace-trim-1.0.0.tgz#46d1dfe98c75bd7d504c05d7d11b1b3e9cc93b10" + integrity sha1-RtHf6Yx1vX1QTAXX0RsbPpzJOxA= + +glsl-tokenizer@^2.0.0, glsl-tokenizer@^2.0.2: + version "2.1.5" + resolved "https://registry.npmjs.org/glsl-tokenizer/-/glsl-tokenizer-2.1.5.tgz#1c2e78c16589933c274ba278d0a63b370c5fee1a" + integrity sha512-XSZEJ/i4dmz3Pmbnpsy3cKh7cotvFlBiZnDOwnj/05EwNp2XrhQ4XKJxT7/pDt4kp4YcpRSKz8eTV7S+mwV6MA== + dependencies: + through2 "^0.6.3" + +glslify-bundle@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/glslify-bundle/-/glslify-bundle-5.0.0.tgz#0252ada1ef9df30b660006e0bb21fd130b486e42" + integrity sha1-AlKtoe+d8wtmAAbguyH9EwtIbkI= + dependencies: + glsl-inject-defines "^1.0.1" + glsl-token-defines "^1.0.0" + glsl-token-depth "^1.1.1" + glsl-token-descope "^1.0.2" + glsl-token-scope "^1.1.1" + glsl-token-string "^1.0.1" + glsl-token-whitespace-trim "^1.0.0" + glsl-tokenizer "^2.0.2" + murmurhash-js "^1.0.0" + shallow-copy "0.0.1" + +glslify-deps@^1.2.5: + version "1.3.1" + resolved "https://registry.npmjs.org/glslify-deps/-/glslify-deps-1.3.1.tgz#dfa6962322454a91ecc4de25b5e710415b0c89ad" + integrity sha512-Ogm179MCazwIRyEqs3g3EOY4Y3XIAa0yl8J5RE9rJC6QH1w8weVOp2RZu0mvnYy/2xIas1w166YR2eZdDkWQxg== + dependencies: + "@choojs/findup" "^0.2.0" + events "^1.0.2" + glsl-resolve "0.0.1" + glsl-tokenizer "^2.0.0" + graceful-fs "^4.1.2" + inherits "^2.0.1" + map-limit "0.0.1" + resolve "^1.0.0" + +glslify@^6.3.1: + version "6.3.1" + resolved "https://registry.npmjs.org/glslify/-/glslify-6.3.1.tgz#af74f4a47497603f21498ad14172396cddc8062f" + integrity sha512-3Hy85N8NmpDprwAxZaOC9k+DBXEwblVZ+yHIyt1QYg5dIrYaiGorz2WWBRxdUzapjDsxdhQ1ad9GSlIebxeBmA== + dependencies: + bl "^1.0.0" + concat-stream "^1.5.2" + duplexify "^3.4.5" + falafel "^2.1.0" + from2 "^2.3.0" + glsl-resolve "0.0.1" + glsl-token-whitespace-trim "^1.0.0" + glslify-bundle "^5.0.0" + glslify-deps "^1.2.5" + minimist "^1.2.0" + resolve "^1.1.5" + stack-trace "0.0.9" + static-eval "^2.0.0" + tape "^4.6.0" + through2 "^2.0.1" + xtend "^4.0.0" + +got@^6.7.1: + version "6.7.1" + resolved "http://registry.npmjs.org/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" + integrity sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA= + dependencies: + create-error-class "^3.0.0" + duplexer3 "^0.1.4" + get-stream "^3.0.0" + is-redirect "^1.0.0" + is-retry-allowed "^1.0.0" + is-stream "^1.0.0" + lowercase-keys "^1.0.0" + safe-buffer "^5.0.1" + timed-out "^4.0.0" + unzip-response "^2.0.1" + url-parse-lax "^1.0.0" + +graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.1.9: + version "4.1.11" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" + integrity sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg= + +growl@1.10.5: + version "1.10.5" + resolved "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" + integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== + +gulp-util@3.0.7: + version "3.0.7" + resolved "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.7.tgz#78925c4b8f8b49005ac01a011c557e6218941cbb" + integrity sha1-eJJcS4+LSQBawBoBHFV+YhiUHLs= + dependencies: + array-differ "^1.0.0" + array-uniq "^1.0.2" + beeper "^1.0.0" + chalk "^1.0.0" + dateformat "^1.0.11" + fancy-log "^1.1.0" + gulplog "^1.0.0" + has-gulplog "^0.1.0" + lodash._reescape "^3.0.0" + lodash._reevaluate "^3.0.0" + lodash._reinterpolate "^3.0.0" + lodash.template "^3.0.0" + minimist "^1.1.0" + multipipe "^0.1.2" + object-assign "^3.0.0" + replace-ext "0.0.1" + through2 "^2.0.0" + vinyl "^0.5.0" + +gulplog@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz#e28c4d45d05ecbbed818363ce8f9c5926229ffe5" + integrity sha1-4oxNRdBey77YGDY86PnFkmIp/+U= + dependencies: + glogg "^1.0.0" + +handle-thing@^1.2.5: + version "1.2.5" + resolved "https://registry.npmjs.org/handle-thing/-/handle-thing-1.2.5.tgz#fd7aad726bf1a5fd16dfc29b2f7a6601d27139c4" + integrity sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ= + +handlebars@^4.0.1, handlebars@^4.0.11: + version "4.0.12" + resolved "https://registry.npmjs.org/handlebars/-/handlebars-4.0.12.tgz#2c15c8a96d46da5e266700518ba8cb8d919d5bc5" + integrity sha512-RhmTekP+FZL+XNhwS1Wf+bTTZpdLougwt5pcgA1tuz6Jcx0fpH/7z0qd71RKnZHBCxIRBHfBOnio4gViPemNzA== + dependencies: + async "^2.5.0" + optimist "^0.6.1" + source-map "^0.6.1" + optionalDependencies: + uglify-js "^3.1.4" + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= + +har-validator@~5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz#44657f5688a22cfd4b72486e81b3a3fb11742c29" + integrity sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA== + dependencies: + ajv "^5.3.0" + har-schema "^2.0.0" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= + dependencies: + ansi-regex "^2.0.0" + +has-binary2@~1.0.2: + version "1.0.3" + resolved "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz#7776ac627f3ea77250cfc332dab7ddf5e4f5d11d" + integrity sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw== + dependencies: + isarray "2.0.1" + +has-cors@1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39" + integrity sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk= + +has-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo= + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-gulplog@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz#6414c82913697da51590397dafb12f22967811ce" + integrity sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4= + dependencies: + sparkles "^1.0.0" + +has-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" + integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q= + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +has@^1.0.1, has@~1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hash-base@^3.0.0: + version "3.0.4" + resolved "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" + integrity sha1-X8hoaEfs1zSZQDMZprCj8/auSRg= + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.5" + resolved "https://registry.npmjs.org/hash.js/-/hash.js-1.1.5.tgz#e38ab4b85dfb1e0c40fe9265c0e9b54854c23812" + integrity sha512-eWI5HG9Np+eHV1KQhisXWwM+4EPPYe5dFX1UZZH7k/E3JzDEazVH+VGlZi6R94ZqImq+A3D1mCEtrFIfg/E7sA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +hasha@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/hasha/-/hasha-2.2.0.tgz#78d7cbfc1e6d66303fe79837365984517b2f6ee1" + integrity sha1-eNfL/B5tZjA/55g3NlmEUXsvbuE= + dependencies: + is-stream "^1.0.1" + pinkie-promise "^2.0.0" + +he@1.1.1, he@1.1.x: + version "1.1.1" + resolved "https://registry.npmjs.org/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" + integrity sha1-k0EP0hsAlzUVH4howvJx80J+I/0= + +hmac-drbg@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +hosted-git-info@^2.1.4: + version "2.7.1" + resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" + integrity sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w== + +hpack.js@^2.1.6: + version "2.1.6" + resolved "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" + integrity sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI= + dependencies: + inherits "^2.0.1" + obuf "^1.0.0" + readable-stream "^2.0.1" + wbuf "^1.1.0" + +html-entities@^1.2.0: + version "1.2.1" + resolved "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f" + integrity sha1-DfKTUfByEWNRXfueVUPl9u7VFi8= + +html-minifier@^3.2.3: + version "3.5.20" + resolved "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.20.tgz#7b19fd3caa0cb79f7cde5ee5c3abdf8ecaa6bb14" + integrity sha512-ZmgNLaTp54+HFKkONyLFEfs5dd/ZOtlquKaTnqIWFmx3Av5zG6ZPcV2d0o9XM2fXOTxxIf6eDcwzFFotke/5zA== + dependencies: + camel-case "3.0.x" + clean-css "4.2.x" + commander "2.17.x" + he "1.1.x" + param-case "2.1.x" + relateurl "0.2.x" + uglify-js "3.4.x" + +html-webpack-plugin@^3.2.0: + version "3.2.0" + resolved "http://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz#b01abbd723acaaa7b37b6af4492ebda03d9dd37b" + integrity sha1-sBq71yOsqqeze2r0SS69oD2d03s= + dependencies: + html-minifier "^3.2.3" + loader-utils "^0.2.16" + lodash "^4.17.3" + pretty-error "^2.0.2" + tapable "^1.0.0" + toposort "^1.0.0" + util.promisify "1.0.0" + +htmlparser2@~3.3.0: + version "3.3.0" + resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.3.0.tgz#cc70d05a59f6542e43f0e685c982e14c924a9efe" + integrity sha1-zHDQWln2VC5D8OaFyYLhTJJKnv4= + dependencies: + domelementtype "1" + domhandler "2.1" + domutils "1.1" + readable-stream "1.0" + +http-deceiver@^1.2.7: + version "1.2.7" + resolved "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" + integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc= + +http-errors@1.6.3, http-errors@~1.6.2, http-errors@~1.6.3: + version "1.6.3" + resolved "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-parser-js@>=0.4.0: + version "0.4.13" + resolved "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.13.tgz#3bd6d6fde6e3172c9334c3b33b6c193d80fe1137" + integrity sha1-O9bW/ebjFyyTNMOzO2wZPYD+ETc= + +http-proxy-middleware@~0.18.0: + version "0.18.0" + resolved "http://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.18.0.tgz#0987e6bb5a5606e5a69168d8f967a87f15dd8aab" + integrity sha512-Fs25KVMPAIIcgjMZkVHJoKg9VcXcC1C8yb9JUgeDvVXY0S/zgVIhMb+qVswDIgtJe2DfckMSY2d6TuTEutlk6Q== + dependencies: + http-proxy "^1.16.2" + is-glob "^4.0.0" + lodash "^4.17.5" + micromatch "^3.1.9" + +http-proxy@^1.13.0, http-proxy@^1.16.2: + version "1.17.0" + resolved "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz#7ad38494658f84605e2f6db4436df410f4e5be9a" + integrity sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g== + dependencies: + eventemitter3 "^3.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= + +iconv-lite@0.4.23: + version "0.4.23" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" + integrity sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +iconv-lite@^0.4.24, iconv-lite@^0.4.4: + version "0.4.24" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ieee754@^1.1.4: + version "1.1.12" + resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b" + integrity sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA== + +iferr@^0.1.5: + version "0.1.5" + resolved "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" + integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= + +ignore-walk@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" + integrity sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ== + dependencies: + minimatch "^3.0.4" + +ignore@^3.3.5: + version "3.3.10" + resolved "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" + integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== + +import-lazy@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" + integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= + +import-local@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" + integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== + dependencies: + pkg-dir "^3.0.0" + resolve-cwd "^2.0.0" + +imports-loader@^0.8.0: + version "0.8.0" + resolved "https://registry.npmjs.org/imports-loader/-/imports-loader-0.8.0.tgz#030ea51b8ca05977c40a3abfd9b4088fe0be9a69" + integrity sha512-kXWL7Scp8KQ4552ZcdVTeaQCZSLW+e6nJfp3cwUMB673T7Hr98Xjx5JK+ql7ADlJUvj1JS5O01RLbKoutN5QDQ== + dependencies: + loader-utils "^1.0.2" + source-map "^0.6.1" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +indent-string@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" + integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA= + dependencies: + repeating "^2.0.0" + +indexof@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" + integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10= + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= + +ini@^1.3.4, ini@~1.3.0: + version "1.3.5" + resolved "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== + +inquirer@6.2.0: + version "6.2.0" + resolved "https://registry.npmjs.org/inquirer/-/inquirer-6.2.0.tgz#51adcd776f661369dc1e894859c2560a224abdd8" + integrity sha512-QIEQG4YyQ2UYZGDC4srMZ7BjHOmNk1lR2JQj5UknBapklm6WHA+VVH7N+sUdX3A7NeCfGF8o4X1S3Ao7nAcIeg== + dependencies: + ansi-escapes "^3.0.0" + chalk "^2.0.0" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^3.0.0" + figures "^2.0.0" + lodash "^4.17.10" + mute-stream "0.0.7" + run-async "^2.2.0" + rxjs "^6.1.0" + string-width "^2.1.0" + strip-ansi "^4.0.0" + through "^2.3.6" + +internal-ip@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/internal-ip/-/internal-ip-3.0.1.tgz#df5c99876e1d2eb2ea2d74f520e3f669a00ece27" + integrity sha512-NXXgESC2nNVtU+pqmC9e6R8B1GpKxzsAQhffvh5AL79qKnodd+L7tnEQmTiUAVngqLalPbSqRA7XGIEL5nCd0Q== + dependencies: + default-gateway "^2.6.0" + ipaddr.js "^1.5.2" + +interpret@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614" + integrity sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ= + +invariant@^2.2.2: + version "2.2.4" + resolved "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +inversify@^4.13.0: + version "4.13.0" + resolved "https://registry.npmjs.org/inversify/-/inversify-4.13.0.tgz#0ab40570bfa4474b04d5b919bbab3a4f682a72f5" + integrity sha512-O5d8y7gKtyRwrvTLZzYET3kdFjqUy58sGpBYMARF13mzqDobpfBXVOPLH7HmnD2VR6Q+1HzZtslGvsdQfeb0SA== + +invert-kv@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" + integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== + +ip-regex@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" + integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= + +ip@^1.1.0, ip@^1.1.5: + version "1.1.5" + resolved "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" + integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= + +ipaddr.js@1.8.0: + version "1.8.0" + resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz#eaa33d6ddd7ace8f7f6fe0c9ca0440e706738b1e" + integrity sha1-6qM9bd16zo9/b+DJygRA5wZzix4= + +ipaddr.js@^1.5.2: + version "1.8.1" + resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.1.tgz#fa4b79fa47fd3def5e3b159825161c0a519c9427" + integrity sha1-+kt5+kf9Pe9eOxWYJRYcClGclCc= + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= + dependencies: + binary-extensions "^1.0.0" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-builtin-module@^1.0.0: + version "1.0.0" + resolved "http://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" + integrity sha1-VAVy0096wxGfj3bDDLwbHgN6/74= + dependencies: + builtin-modules "^1.0.0" + +is-callable@^1.1.3, is-callable@^1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" + integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + +is-date-object@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" + integrity sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY= + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-finite@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" + integrity sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko= + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= + dependencies: + is-extglob "^2.1.0" + +is-glob@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0" + integrity sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A= + dependencies: + is-extglob "^2.1.1" + +is-installed-globally@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80" + integrity sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA= + dependencies: + global-dirs "^0.1.0" + is-path-inside "^1.0.0" + +is-npm@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" + integrity sha1-8vtjpl5JBbQGyGBydloaTceTufQ= + +is-number@^0.1.1: + version "0.1.1" + resolved "https://registry.npmjs.org/is-number/-/is-number-0.1.1.tgz#69a7af116963d47206ec9bd9b48a14216f1e3806" + integrity sha1-aaevEWlj1HIG7JvZtIoUIW8eOAY= + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + dependencies: + kind-of "^3.0.2" + +is-obj@^1.0.0: + version "1.0.1" + resolved "http://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= + +is-path-cwd@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" + integrity sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0= + +is-path-in-cwd@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52" + integrity sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ== + dependencies: + is-path-inside "^1.0.0" + +is-path-inside@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" + integrity sha1-jvW33lBDej/cprToZe96pVy0gDY= + dependencies: + path-is-inside "^1.0.1" + +is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-promise@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" + integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= + +is-redirect@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" + integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ= + +is-regex@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" + integrity sha1-VRdIm1RwkbCTDglWVM7SXul+lJE= + dependencies: + has "^1.0.1" + +is-retry-allowed@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" + integrity sha1-EaBgVotnM5REAz0BJaYaINVk+zQ= + +is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + +is-symbol@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" + integrity sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw== + dependencies: + has-symbols "^1.0.0" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + +is-utf8@^0.2.0: + version "0.2.1" + resolved "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= + +is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= + +isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isarray@2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz#a37d94ed9cda2d59865c9f76fe596ee1f338741e" + integrity sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4= + +isbinaryfile@^3.0.0: + version "3.0.3" + resolved "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz#5d6def3edebf6e8ca8cae9c30183a804b5f8be80" + integrity sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw== + dependencies: + buffer-alloc "^1.2.0" + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + +istanbul-api@^2.0.5: + version "2.0.6" + resolved "https://registry.npmjs.org/istanbul-api/-/istanbul-api-2.0.6.tgz#cd7b33ee678f6c01531d05f5e567ebbcd25f8ecc" + integrity sha512-8W5oeAGWXhtTJjAyVfvavOLVyZCTNCKsyF6GON/INKlBdO7uJ/bv3qnPj5M6ERKzmMCJS1kntnjjGuJ86fn3rQ== + dependencies: + async "^2.6.1" + compare-versions "^3.2.1" + fileset "^2.0.3" + istanbul-lib-coverage "^2.0.1" + istanbul-lib-hook "^2.0.1" + istanbul-lib-instrument "^3.0.0" + istanbul-lib-report "^2.0.2" + istanbul-lib-source-maps "^2.0.1" + istanbul-reports "^2.0.1" + js-yaml "^3.12.0" + make-dir "^1.3.0" + once "^1.4.0" + +istanbul-instrumenter-loader@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/istanbul-instrumenter-loader/-/istanbul-instrumenter-loader-3.0.1.tgz#9957bd59252b373fae5c52b7b5188e6fde2a0949" + integrity sha512-a5SPObZgS0jB/ixaKSMdn6n/gXSrK2S6q/UfRJBT3e6gQmVjwZROTODQsYW5ZNwOu78hG62Y3fWlebaVOL0C+w== + dependencies: + convert-source-map "^1.5.0" + istanbul-lib-instrument "^1.7.3" + loader-utils "^1.1.0" + schema-utils "^0.3.0" + +istanbul-lib-coverage@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz#ccf7edcd0a0bb9b8f729feeb0930470f9af664f0" + integrity sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ== + +istanbul-lib-coverage@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz#2aee0e073ad8c5f6a0b00e0dfbf52b4667472eda" + integrity sha512-nPvSZsVlbG9aLhZYaC3Oi1gT/tpyo3Yt5fNyf6NmcKIayz4VV/txxJFFKAK/gU4dcNn8ehsanBbVHVl0+amOLA== + +istanbul-lib-hook@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.1.tgz#918a57b75a0f951d552a08487ca1fa5336433d72" + integrity sha512-ufiZoiJ8CxY577JJWEeFuxXZoMqiKpq/RqZtOAYuQLvlkbJWscq9n3gc4xrCGH9n4pW0qnTxOz1oyMmVtk8E1w== + dependencies: + append-transform "^1.0.0" + +istanbul-lib-instrument@^1.7.3: + version "1.10.2" + resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz#1f55ed10ac3c47f2bdddd5307935126754d0a9ca" + integrity sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A== + dependencies: + babel-generator "^6.18.0" + babel-template "^6.16.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" + babylon "^6.18.0" + istanbul-lib-coverage "^1.2.1" + semver "^5.3.0" + +istanbul-lib-instrument@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.0.0.tgz#b5f066b2a161f75788be17a9d556f40a0cf2afc9" + integrity sha512-eQY9vN9elYjdgN9Iv6NS/00bptm02EBBk70lRMaVjeA6QYocQgenVrSgC28TJurdnZa80AGO3ASdFN+w/njGiQ== + dependencies: + "@babel/generator" "^7.0.0" + "@babel/parser" "^7.0.0" + "@babel/template" "^7.0.0" + "@babel/traverse" "^7.0.0" + "@babel/types" "^7.0.0" + istanbul-lib-coverage "^2.0.1" + semver "^5.5.0" + +istanbul-lib-report@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.2.tgz#430a2598519113e1da7af274ba861bd42dd97535" + integrity sha512-rJ8uR3peeIrwAxoDEbK4dJ7cqqtxBisZKCuwkMtMv0xYzaAnsAi3AHrHPAAtNXzG/bcCgZZ3OJVqm1DTi9ap2Q== + dependencies: + istanbul-lib-coverage "^2.0.1" + make-dir "^1.3.0" + supports-color "^5.4.0" + +istanbul-lib-source-maps@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-2.0.1.tgz#ce8b45131d8293fdeaa732f4faf1852d13d0a97e" + integrity sha512-30l40ySg+gvBLcxTrLzR4Z2XTRj3HgRCA/p2rnbs/3OiTaoj054gAbuP5DcLOtwqmy4XW8qXBHzrmP2/bQ9i3A== + dependencies: + debug "^3.1.0" + istanbul-lib-coverage "^2.0.1" + make-dir "^1.3.0" + rimraf "^2.6.2" + source-map "^0.6.1" + +istanbul-reports@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.0.1.tgz#fb8d6ea850701a3984350b977a969e9a556116a7" + integrity sha512-CT0QgMBJqs6NJLF678ZHcquUAZIoBIUNzdJrRJfpkI9OnzG6MkUfHxbJC3ln981dMswC7/B1mfX3LNkhgJxsuw== + dependencies: + handlebars "^4.0.11" + +istanbul@0.4.5, istanbul@^0.4.3, istanbul@^0.4.5: + version "0.4.5" + resolved "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz#65c7d73d4c4da84d4f3ac310b918fb0b8033733b" + integrity sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs= + dependencies: + abbrev "1.0.x" + async "1.x" + escodegen "1.8.x" + esprima "2.7.x" + glob "^5.0.15" + handlebars "^4.0.1" + js-yaml "3.x" + mkdirp "0.5.x" + nopt "3.x" + once "1.x" + resolve "1.1.x" + supports-color "^3.1.0" + which "^1.1.1" + wordwrap "^1.0.0" + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= + +js-yaml@3.x, js-yaml@^3.12.0, js-yaml@^3.7.0: + version "3.12.0" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1" + integrity sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + +jsesc@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s= + +jsesc@^2.5.1: + version "2.5.1" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.1.tgz#e421a2a8e20d6b0819df28908f782526b96dd1fe" + integrity sha1-5CGiqOINawgZ3yiQj3glJrlt0f4= + +json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-schema-traverse@^0.3.0: + version "0.3.1" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" + integrity sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A= + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + +json3@^3.3.2: + version "3.3.2" + resolved "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" + integrity sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE= + +json5@^0.5.0: + version "0.5.1" + resolved "http://registry.npmjs.org/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= + +jsonfile@^2.1.0: + version "2.4.0" + resolved "http://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" + integrity sha1-NzaitCi4e72gzIO1P6PWM6NcKug= + optionalDependencies: + graceful-fs "^4.1.6" + +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= + +jsprim@^1.2.2: + version "1.4.1" + resolved "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + +just-extend@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/just-extend/-/just-extend-3.0.0.tgz#cee004031eaabf6406da03a7b84e4fe9d78ef288" + integrity sha512-Fu3T6pKBuxjWT/p4DkqGHFRsysc8OauWr4ZRTY9dIx07Y9O0RkoR5jcv28aeD1vuAwhm3nLkDurwLXoALp4DpQ== + +karma-chai@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/karma-chai/-/karma-chai-0.1.0.tgz#bee5ad40400517811ae34bb945f762909108b79a" + integrity sha1-vuWtQEAFF4Ea40u5RfdikJEIt5o= + +karma-chrome-launcher@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz#cf1b9d07136cc18fe239327d24654c3dbc368acf" + integrity sha512-uf/ZVpAabDBPvdPdveyk1EPgbnloPvFFGgmRhYLTDH7gEB4nZdSBk8yTU47w1g/drLSx5uMOkjKk7IWKfWg/+w== + dependencies: + fs-access "^1.0.0" + which "^1.2.1" + +karma-coverage-istanbul-reporter@^2.0.4: + version "2.0.4" + resolved "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-2.0.4.tgz#402ae4ed6eadb9d9dafbd408ffda17897c0d003a" + integrity sha512-xJS7QSQIVU6VK9HuJ/ieE5yynxKhjCCkd96NLY/BX/HXsx0CskU9JJiMQbd4cHALiddMwI4OWh1IIzeWrsavJw== + dependencies: + istanbul-api "^2.0.5" + minimatch "^3.0.4" + +karma-es6-shim@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/karma-es6-shim/-/karma-es6-shim-1.0.0.tgz#aaeb530862bcf79340ebd588f4f9e57de842b479" + integrity sha1-qutTCGK895NA69WI9PnlfehCtHk= + dependencies: + es5-shim "~4.5.8" + es6-shim "~0.35.0" + +karma-mocha-reporter@^2.2.5: + version "2.2.5" + resolved "https://registry.npmjs.org/karma-mocha-reporter/-/karma-mocha-reporter-2.2.5.tgz#15120095e8ed819186e47a0b012f3cd741895560" + integrity sha1-FRIAlejtgZGG5HoLAS8810GJVWA= + dependencies: + chalk "^2.1.0" + log-symbols "^2.1.0" + strip-ansi "^4.0.0" + +karma-mocha@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/karma-mocha/-/karma-mocha-1.3.0.tgz#eeaac7ffc0e201eb63c467440d2b69c7cf3778bf" + integrity sha1-7qrH/8DiAetjxGdEDStpx883eL8= + dependencies: + minimist "1.2.0" + +karma-phantomjs-launcher@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/karma-phantomjs-launcher/-/karma-phantomjs-launcher-1.0.4.tgz#d23ca34801bda9863ad318e3bb4bd4062b13acd2" + integrity sha1-0jyjSAG9qYY60xjju0vUBisTrNI= + dependencies: + lodash "^4.0.1" + phantomjs-prebuilt "^2.1.7" + +karma-remap-istanbul@^0.6.0: + version "0.6.0" + resolved "https://registry.npmjs.org/karma-remap-istanbul/-/karma-remap-istanbul-0.6.0.tgz#97f3b770065254f9b4724f2d9be4a3a2e1baf6fc" + integrity sha1-l/O3cAZSVPm0ck8tm+SjouG69vw= + dependencies: + istanbul "^0.4.3" + remap-istanbul "^0.9.0" + +karma-sinon-chai@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/karma-sinon-chai/-/karma-sinon-chai-2.0.2.tgz#e28c109b989973abafc28a7c9f09ef24a05e07c2" + integrity sha512-SDgh6V0CUd+7ruL1d3yG6lFzmJNGRNQuEuCYXLaorruNP9nwQfA7hpsp4clx4CbOo5Gsajh3qUOT7CrVStUKMw== + +karma-sinon@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/karma-sinon/-/karma-sinon-1.0.5.tgz#4e3443f2830fdecff624d3747163f1217daa2a9a" + integrity sha1-TjRD8oMP3s/2JNN0cWPxIX2qKpo= + +karma-sourcemap-loader@^0.3.7: + version "0.3.7" + resolved "https://registry.npmjs.org/karma-sourcemap-loader/-/karma-sourcemap-loader-0.3.7.tgz#91322c77f8f13d46fed062b042e1009d4c4505d8" + integrity sha1-kTIsd/jxPUb+0GKwQuEAnUxFBdg= + dependencies: + graceful-fs "^4.1.2" + +karma-sourcemap-writer@^0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/karma-sourcemap-writer/-/karma-sourcemap-writer-0.1.2.tgz#3465e0074a2b4181d3db1ac4192a3c8e46d0212a" + integrity sha1-NGXgB0orQYHT2xrEGSo8jkbQISo= + dependencies: + graceful-fs "^4.1.3" + +karma-webpack@^3.0.5: + version "3.0.5" + resolved "https://registry.npmjs.org/karma-webpack/-/karma-webpack-3.0.5.tgz#1ff1e3a690fb73ae95ee95f9ab58f341cfc7b40f" + integrity sha512-nRudGJWstvVuA6Tbju9tyGUfXTtI1UXMXoRHVmM2/78D0q6s/Ye2IC157PKNDC15PWFGR0mVIRtWLAdcfsRJoA== + dependencies: + async "^2.0.0" + babel-runtime "^6.0.0" + loader-utils "^1.0.0" + lodash "^4.0.0" + source-map "^0.5.6" + webpack-dev-middleware "^2.0.6" + +karma@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/karma/-/karma-3.0.0.tgz#6da83461a8a28d8224575c3b5b874e271b4730c3" + integrity sha512-ZTjyuDXVXhXsvJ1E4CnZzbCjSxD6sEdzEsFYogLuZM0yqvg/mgz+O+R1jb0J7uAQeuzdY8kJgx6hSNXLwFuHIQ== + dependencies: + bluebird "^3.3.0" + body-parser "^1.16.1" + chokidar "^2.0.3" + colors "^1.1.0" + combine-lists "^1.0.0" + connect "^3.6.0" + core-js "^2.2.0" + di "^0.0.1" + dom-serialize "^2.2.0" + expand-braces "^0.1.1" + glob "^7.1.1" + graceful-fs "^4.1.2" + http-proxy "^1.13.0" + isbinaryfile "^3.0.0" + lodash "^4.17.4" + log4js "^3.0.0" + mime "^2.3.1" + minimatch "^3.0.2" + optimist "^0.6.1" + qjobs "^1.1.4" + range-parser "^1.2.0" + rimraf "^2.6.0" + safe-buffer "^5.0.1" + socket.io "2.1.1" + source-map "^0.6.1" + tmp "0.0.33" + useragent "2.2.1" + +kew@^0.7.0: + version "0.7.0" + resolved "https://registry.npmjs.org/kew/-/kew-0.7.0.tgz#79d93d2d33363d6fdd2970b335d9141ad591d79b" + integrity sha1-edk9LTM2PW/dKXCzNdkUGtWR15s= + +killable@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" + integrity sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg== + +kind-of@^1.1.0: + version "1.1.0" + resolved "http://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz#140a3d2d41a36d2efcfa9377b62c24f8495a5c44" + integrity sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ= + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.2" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" + integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== + +klaw@^1.0.0: + version "1.3.1" + resolved "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" + integrity sha1-QIhDO0azsbolnXh4XY6W9zugJDk= + optionalDependencies: + graceful-fs "^4.1.9" + +latest-version@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" + integrity sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU= + dependencies: + package-json "^4.0.0" + +lazy-ass@1.6.0: + version "1.6.0" + resolved "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz#7999655e8646c17f089fdd187d150d3324d54513" + integrity sha1-eZllXoZGwX8In90YfRUNMyTVRRM= + +lcid@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" + integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA== + dependencies: + invert-kv "^2.0.0" + +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +load-json-file@^1.0.0: + version "1.1.0" + resolved "http://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + pinkie-promise "^2.0.0" + strip-bom "^2.0.0" + +load-json-file@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" + integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= + dependencies: + graceful-fs "^4.1.2" + parse-json "^4.0.0" + pify "^3.0.0" + strip-bom "^3.0.0" + +loader-runner@^2.3.0: + version "2.3.1" + resolved "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.1.tgz#026f12fe7c3115992896ac02ba022ba92971b979" + integrity sha512-By6ZFY7ETWOc9RFaAIb23IjJVcM4dvJC/N57nmdz9RSkMXvAXGI7SyVlAw3v8vjtDRlqThgVDVmTnr9fqMlxkw== + +loader-utils@^0.2.16: + version "0.2.17" + resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348" + integrity sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g= + dependencies: + big.js "^3.1.3" + emojis-list "^2.0.0" + json5 "^0.5.0" + object-assign "^4.0.1" + +loader-utils@^1.0.0, loader-utils@^1.0.2, loader-utils@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd" + integrity sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0= + dependencies: + big.js "^3.1.3" + emojis-list "^2.0.0" + json5 "^0.5.0" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +lodash._basecopy@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" + integrity sha1-jaDmqHbPNEwK2KVIghEd08XHyjY= + +lodash._basetostring@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz#d1861d877f824a52f669832dcaf3ee15566a07d5" + integrity sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U= + +lodash._basevalues@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz#5b775762802bde3d3297503e26300820fdf661b7" + integrity sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc= + +lodash._getnative@^3.0.0: + version "3.9.1" + resolved "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" + integrity sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U= + +lodash._isiterateecall@^3.0.0: + version "3.0.9" + resolved "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" + integrity sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw= + +lodash._reescape@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz#2b1d6f5dfe07c8a355753e5f27fac7f1cde1616a" + integrity sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo= + +lodash._reevaluate@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz#58bc74c40664953ae0b124d806996daca431e2ed" + integrity sha1-WLx0xAZklTrgsSTYBpltrKQx4u0= + +lodash._reinterpolate@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" + integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= + +lodash._root@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692" + integrity sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI= + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= + +lodash.escape@^3.0.0: + version "3.2.0" + resolved "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz#995ee0dc18c1b48cc92effae71a10aab5b487698" + integrity sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg= + dependencies: + lodash._root "^3.0.0" + +lodash.get@^4.4.2: + version "4.4.2" + resolved "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" + integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= + +lodash.isarguments@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" + integrity sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo= + +lodash.isarray@^3.0.0: + version "3.0.4" + resolved "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" + integrity sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U= + +lodash.keys@^3.0.0: + version "3.1.2" + resolved "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" + integrity sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo= + dependencies: + lodash._getnative "^3.0.0" + lodash.isarguments "^3.0.0" + lodash.isarray "^3.0.0" + +lodash.restparam@^3.0.0: + version "3.6.1" + resolved "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" + integrity sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU= + +lodash.template@^3.0.0: + version "3.6.2" + resolved "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz#f8cdecc6169a255be9098ae8b0c53d378931d14f" + integrity sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8= + dependencies: + lodash._basecopy "^3.0.0" + lodash._basetostring "^3.0.0" + lodash._basevalues "^3.0.0" + lodash._isiterateecall "^3.0.0" + lodash._reinterpolate "^3.0.0" + lodash.escape "^3.0.0" + lodash.keys "^3.0.0" + lodash.restparam "^3.0.0" + lodash.templatesettings "^3.0.0" + +lodash.templatesettings@^3.0.0: + version "3.1.1" + resolved "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz#fb307844753b66b9f1afa54e262c745307dba8e5" + integrity sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU= + dependencies: + lodash._reinterpolate "^3.0.0" + lodash.escape "^3.0.0" + +lodash.toarray@^4.4.0: + version "4.4.0" + resolved "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-4.4.0.tgz#24c4bfcd6b2fba38bfd0594db1179d8e9b656561" + integrity sha1-JMS/zWsvuji/0FlNsRedjptlZWE= + +lodash@4.17.10: + version "4.17.10" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" + integrity sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg== + +lodash@4.17.4: + version "4.17.4" + resolved "http://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" + integrity sha1-eCA6TRwyiuHYbcpkYONptX9AVa4= + +lodash@^4.0.0, lodash@^4.0.1, lodash@^4.17.10, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.5.0: + version "4.17.11" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" + integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== + +log-symbols@^2.1.0: + version "2.2.0" + resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" + integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== + dependencies: + chalk "^2.0.1" + +log-update@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/log-update/-/log-update-1.0.2.tgz#19929f64c4093d2d2e7075a1dad8af59c296b8d1" + integrity sha1-GZKfZMQJPS0ucHWh2tivWcKWuNE= + dependencies: + ansi-escapes "^1.0.0" + cli-cursor "^1.0.2" + +log4js@^3.0.0: + version "3.0.6" + resolved "https://registry.npmjs.org/log4js/-/log4js-3.0.6.tgz#e6caced94967eeeb9ce399f9f8682a4b2b28c8ff" + integrity sha512-ezXZk6oPJCWL483zj64pNkMuY/NcRX5MPiB0zE6tjZM137aeusrOnW1ecxgF9cmwMWkBMhjteQxBPoZBh9FDxQ== + dependencies: + circular-json "^0.5.5" + date-format "^1.2.0" + debug "^3.1.0" + rfdc "^1.1.2" + streamroller "0.7.0" + +loglevel@^1.4.1: + version "1.6.1" + resolved "https://registry.npmjs.org/loglevel/-/loglevel-1.6.1.tgz#e0fc95133b6ef276cdc8887cdaf24aa6f156f8fa" + integrity sha1-4PyVEztu8nbNyIh82vJKpvFW+Po= + +loglevelnext@^1.0.1: + version "1.0.5" + resolved "https://registry.npmjs.org/loglevelnext/-/loglevelnext-1.0.5.tgz#36fc4f5996d6640f539ff203ba819641680d75a2" + integrity sha512-V/73qkPuJmx4BcBF19xPBr+0ZRVBhc4POxvZTZdMeXpJ4NItXSJ/MSwuFT0kQJlCbXvdlZoQQ/418bS1y9Jh6A== + dependencies: + es6-symbol "^3.1.1" + object.assign "^4.1.0" + +lolex@^2.3.2, lolex@^2.4.2: + version "2.7.5" + resolved "https://registry.npmjs.org/lolex/-/lolex-2.7.5.tgz#113001d56bfc7e02d56e36291cc5c413d1aa0733" + integrity sha512-l9x0+1offnKKIzYVjyXU2SiwhXDLekRzKyhnbyldPHvC7BvLPVpdNUNR2KeMAiCN2D/kLNttZgQD5WjSxuBx3Q== + +loose-envify@^1.0.0: + version "1.4.0" + resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +loud-rejection@^1.0.0, loud-rejection@^1.6.0: + version "1.6.0" + resolved "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" + integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= + dependencies: + currently-unhandled "^0.4.1" + signal-exit "^3.0.0" + +lower-case@^1.1.1: + version "1.1.4" + resolved "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" + integrity sha1-miyr0bno4K6ZOkv31YdcOcQujqw= + +lowercase-keys@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" + integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== + +lru-cache@2.2.x: + version "2.2.4" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-2.2.4.tgz#6c658619becf14031d0d0b594b16042ce4dc063d" + integrity sha1-bGWGGb7PFAMdDQtZSxYELOTcBj0= + +lru-cache@^4.0.0, lru-cache@^4.0.1, lru-cache@^4.1.1, lru-cache@^4.1.3: + version "4.1.3" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c" + integrity sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA== + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +make-dir@^1.0.0, make-dir@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" + integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== + dependencies: + pify "^3.0.0" + +make-error@^1.1.1: + version "1.3.5" + resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz#efe4e81f6db28cadd605c70f29c831b58ef776c8" + integrity sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g== + +map-age-cleaner@^0.1.1: + version "0.1.2" + resolved "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.2.tgz#098fb15538fd3dbe461f12745b0ca8568d4e3f74" + integrity sha512-UN1dNocxQq44IhJyMI4TU8phc2m9BddacHRPRjKGLYaF0jqd3xLz0jS0skpAU9WgYyoR4gHtUpzytNBS385FWQ== + dependencies: + p-defer "^1.0.0" + +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + +map-limit@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/map-limit/-/map-limit-0.0.1.tgz#eb7961031c0f0e8d001bf2d56fab685d58822f38" + integrity sha1-63lhAxwPDo0AG/LVb6toXViCLzg= + dependencies: + once "~1.3.0" + +map-obj@^1.0.0, map-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + dependencies: + object-visit "^1.0.0" + +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + +mem@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/mem/-/mem-4.0.0.tgz#6437690d9471678f6cc83659c00cbafcd6b0cdaf" + integrity sha512-WQxG/5xYc3tMbYLXoXPm81ET2WDULiU5FxbuIoNbJqLOOI8zehXFdZuiUEgfdrU2mVB1pxBZUGlYORSrpuJreA== + dependencies: + map-age-cleaner "^0.1.1" + mimic-fn "^1.0.0" + p-is-promise "^1.1.0" + +memory-fs@^0.4.0, memory-fs@~0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" + integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +meow@^3.3.0: + version "3.7.0" + resolved "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" + integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= + dependencies: + camelcase-keys "^2.0.0" + decamelize "^1.1.2" + loud-rejection "^1.0.0" + map-obj "^1.0.1" + minimist "^1.1.3" + normalize-package-data "^2.3.4" + object-assign "^4.0.1" + read-pkg-up "^1.0.1" + redent "^1.0.0" + trim-newlines "^1.0.0" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= + +merge2@^1.2.1: + version "1.2.2" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.2.2.tgz#03212e3da8d86c4d8523cebd6318193414f94e34" + integrity sha512-bgM8twH86rWni21thii6WCMQMRMmwqqdW3sGWi9IipnVAszdLXRjwDwAnyrVXo6DuP3AjRMMttZKUB48QWIFGg== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + +micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8, micromatch@^3.1.9: + version "3.1.10" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + +"mime-db@>= 1.36.0 < 2", mime-db@~1.36.0: + version "1.36.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.36.0.tgz#5020478db3c7fe93aad7bbcc4dcf869c43363397" + integrity sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw== + +mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.18, mime-types@~2.1.19: + version "2.1.20" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.20.tgz#930cb719d571e903738520f8470911548ca2cc19" + integrity sha512-HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A== + dependencies: + mime-db "~1.36.0" + +mime@1.4.1: + version "1.4.1" + resolved "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" + integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== + +mime@^2.1.0, mime@^2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/mime/-/mime-2.3.1.tgz#b1621c54d63b97c47d3cfe7f7215f7d64517c369" + integrity sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg== + +mimic-fn@^1.0.0: + version "1.2.0" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= + +"minimatch@2 || 3", minimatch@3.0.4, minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@0.0.8: + version "0.0.8" + resolved "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= + +minimist@1.2.0, minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0, minimist@~1.2.0: + version "1.2.0" + resolved "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= + +minimist@~0.0.1: + version "0.0.10" + resolved "http://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" + integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= + +minipass@^2.2.1, minipass@^2.3.3: + version "2.3.4" + resolved "https://registry.npmjs.org/minipass/-/minipass-2.3.4.tgz#4768d7605ed6194d6d576169b9e12ef71e9d9957" + integrity sha512-mlouk1OHlaUE8Odt1drMtG1bAJA4ZA6B/ehysgV0LUIrDHdKgo1KorZq3pK0b/7Z7LJIQ12MNM6aC+Tn6lUZ5w== + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + +minizlib@^1.1.0: + version "1.1.1" + resolved "https://registry.npmjs.org/minizlib/-/minizlib-1.1.1.tgz#6734acc045a46e61d596a43bb9d9cd326e19cc42" + integrity sha512-TrfjCjk4jLhcJyGMYymBH6oTXcWjYbUAXTHDbtnWHjZC25h0cdajHuPE1zxb4DVmu8crfh+HwH/WMuyLG0nHBg== + dependencies: + minipass "^2.2.1" + +mississippi@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz#3442a508fafc28500486feea99409676e4ee5a6f" + integrity sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw== + dependencies: + concat-stream "^1.5.0" + duplexify "^3.4.2" + end-of-stream "^1.1.0" + flush-write-stream "^1.0.0" + from2 "^2.1.0" + parallel-transform "^1.1.0" + pump "^2.0.1" + pumpify "^1.3.3" + stream-each "^1.1.0" + through2 "^2.0.0" + +mississippi@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" + integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== + dependencies: + concat-stream "^1.5.0" + duplexify "^3.4.2" + end-of-stream "^1.1.0" + flush-write-stream "^1.0.0" + from2 "^2.1.0" + parallel-transform "^1.1.0" + pump "^3.0.0" + pumpify "^1.3.3" + stream-each "^1.1.0" + through2 "^2.0.0" + +mixin-deep@^1.2.0: + version "1.3.1" + resolved "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" + integrity sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mkdirp@0.5.1, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0: + version "0.5.1" + resolved "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= + dependencies: + minimist "0.0.8" + +mocha@^5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz#6d8ae508f59167f940f2b5b3c4a612ae50c90ae6" + integrity sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ== + dependencies: + browser-stdout "1.3.1" + commander "2.15.1" + debug "3.1.0" + diff "3.5.0" + escape-string-regexp "1.0.5" + glob "7.1.2" + growl "1.10.5" + he "1.1.1" + minimatch "3.0.4" + mkdirp "0.5.1" + supports-color "5.4.0" + +moment-timezone@0.5.14: + version "0.5.14" + resolved "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.14.tgz#4eb38ff9538b80108ba467a458f3ed4268ccfcb1" + integrity sha1-TrOP+VOLgBCLpGekWPPtQmjM/LE= + dependencies: + moment ">= 2.9.0" + +moment@2.19.3: + version "2.19.3" + resolved "https://registry.npmjs.org/moment/-/moment-2.19.3.tgz#bdb99d270d6d7fda78cc0fbace855e27fe7da69f" + integrity sha1-vbmdJw1tf9p4zA+6zoVeJ/59pp8= + +"moment@>= 2.9.0": + version "2.22.2" + resolved "https://registry.npmjs.org/moment/-/moment-2.22.2.tgz#3c257f9839fc0e93ff53149632239eb90783ff66" + integrity sha1-PCV/mDn8DpP/UxSWMiOeuQeD/2Y= + +move-concurrently@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" + integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I= + dependencies: + aproba "^1.1.1" + copy-concurrently "^1.0.0" + fs-write-stream-atomic "^1.0.8" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.3" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + +multicast-dns-service-types@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" + integrity sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE= + +multicast-dns@^6.0.1: + version "6.2.3" + resolved "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229" + integrity sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g== + dependencies: + dns-packet "^1.3.1" + thunky "^1.0.2" + +multipipe@^0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz#2a8f2ddf70eed564dff2d57f1e1a137d9f05078b" + integrity sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s= + dependencies: + duplexer2 "0.0.2" + +murmurhash-js@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/murmurhash-js/-/murmurhash-js-1.0.0.tgz#b06278e21fc6c37fa5313732b0412bcb6ae15f51" + integrity sha1-sGJ44h/Gw3+lMTcysEEry2rhX1E= + +mute-stream@0.0.7: + version "0.0.7" + resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= + +nan@^2.9.2: + version "2.11.1" + resolved "https://registry.npmjs.org/nan/-/nan-2.11.1.tgz#90e22bccb8ca57ea4cd37cc83d3819b52eea6766" + integrity sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA== + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +needle@^2.2.1: + version "2.2.4" + resolved "https://registry.npmjs.org/needle/-/needle-2.2.4.tgz#51931bff82533b1928b7d1d69e01f1b00ffd2a4e" + integrity sha512-HyoqEb4wr/rsoaIDfTH2aVL9nWtQqba2/HvMv+++m8u0dz808MaagKILxtfeSN7QU7nvbQ79zk3vYOJp9zsNEA== + dependencies: + debug "^2.1.2" + iconv-lite "^0.4.4" + sax "^1.2.4" + +negotiator@0.6.1: + version "0.6.1" + resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" + integrity sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk= + +neo-async@^2.5.0: + version "2.5.2" + resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.5.2.tgz#489105ce7bc54e709d736b195f82135048c50fcc" + integrity sha512-vdqTKI9GBIYcAEbFAcpKPErKINfPF5zIuz3/niBfq8WUZjpT2tytLlFVrBgWdOtqI4uaA/Rb6No0hux39XXDuw== + +next-tick@1: + version "1.0.0" + resolved "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" + integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +nise@^1.3.3: + version "1.4.5" + resolved "https://registry.npmjs.org/nise/-/nise-1.4.5.tgz#979a97a19c48d627bb53703726ae8d53ce8d4b3e" + integrity sha512-OHRVvdxKgwZELf2DTgsJEIA4MOq8XWvpSUzoOXyxJ2mY0mMENWC66+70AShLR2z05B1dzrzWlUQJmJERlOUpZw== + dependencies: + "@sinonjs/formatio" "3.0.0" + just-extend "^3.0.0" + lolex "^2.3.2" + path-to-regexp "^1.7.0" + text-encoding "^0.6.4" + +no-case@^2.2.0: + version "2.3.2" + resolved "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac" + integrity sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ== + dependencies: + lower-case "^1.1.1" + +node-emoji@1.8.1: + version "1.8.1" + resolved "https://registry.npmjs.org/node-emoji/-/node-emoji-1.8.1.tgz#6eec6bfb07421e2148c75c6bba72421f8530a826" + integrity sha512-+ktMAh1Jwas+TnGodfCfjUbJKoANqPaJFN0z0iqh41eqD8dvguNzcitVSBSVK1pidz0AqGbLKcoVuVLRVZ/aVg== + dependencies: + lodash.toarray "^4.4.0" + +node-forge@0.7.5: + version "0.7.5" + resolved "https://registry.npmjs.org/node-forge/-/node-forge-0.7.5.tgz#6c152c345ce11c52f465c2abd957e8639cd674df" + integrity sha512-MmbQJ2MTESTjt3Gi/3yG1wGpIMhUfcIypUCGtTizFR9IiccFwxSpfp0vtIZlkFclEqERemxfnSdZEMR9VqqEFQ== + +node-libs-browser@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz#5f94263d404f6e44767d726901fff05478d600df" + integrity sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg== + dependencies: + assert "^1.1.1" + browserify-zlib "^0.2.0" + buffer "^4.3.0" + console-browserify "^1.1.0" + constants-browserify "^1.0.0" + crypto-browserify "^3.11.0" + domain-browser "^1.1.1" + events "^1.0.0" + https-browserify "^1.0.0" + os-browserify "^0.3.0" + path-browserify "0.0.0" + process "^0.11.10" + punycode "^1.2.4" + querystring-es3 "^0.2.0" + readable-stream "^2.3.3" + stream-browserify "^2.0.1" + stream-http "^2.7.2" + string_decoder "^1.0.0" + timers-browserify "^2.0.4" + tty-browserify "0.0.0" + url "^0.11.0" + util "^0.10.3" + vm-browserify "0.0.4" + +node-pre-gyp@^0.10.0: + version "0.10.3" + resolved "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc" + integrity sha512-d1xFs+C/IPS8Id0qPTZ4bUT8wWryfR/OzzAFxweG+uLN85oPzyo2Iw6bVlLQ/JOdgNonXLCoRyqDzDWq4iw72A== + dependencies: + detect-libc "^1.0.2" + mkdirp "^0.5.1" + needle "^2.2.1" + nopt "^4.0.1" + npm-packlist "^1.1.6" + npmlog "^4.0.2" + rc "^1.2.7" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^4" + +nopt@3.x: + version "3.0.6" + resolved "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k= + dependencies: + abbrev "1" + +nopt@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" + integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= + dependencies: + abbrev "1" + osenv "^0.1.4" + +normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: + version "2.4.0" + resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" + integrity sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw== + dependencies: + hosted-git-info "^2.1.4" + is-builtin-module "^1.0.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^2.0.1, normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= + dependencies: + remove-trailing-separator "^1.0.1" + +npm-bundled@^1.0.1: + version "1.0.5" + resolved "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.5.tgz#3c1732b7ba936b3a10325aef616467c0ccbcc979" + integrity sha512-m/e6jgWu8/v5niCUKQi9qQl8QdeEduFA96xHDDzFGqly0OOjI7c+60KM/2sppfnUU9JJagf+zs+yGhqSOFj71g== + +npm-packlist@^1.1.6: + version "1.1.12" + resolved "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.1.12.tgz#22bde2ebc12e72ca482abd67afc51eb49377243a" + integrity sha512-WJKFOVMeAlsU/pjXuqVdzU0WfgtIBCupkEVwn+1Y0ERAbUfWw8R4GjgVbaKnUjRoD2FoQbHOCbOyT5Mbs9Lw4g== + dependencies: + ignore-walk "^3.0.1" + npm-bundled "^1.0.1" + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + dependencies: + path-key "^2.0.0" + +npmlog@^4.0.2: + version "4.1.2" + resolved "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + +nth-check@~1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz#9929acdf628fc2c41098deab82ac580cf149aae4" + integrity sha1-mSms32KPwsQQmN6rgqxYDPFJquQ= + dependencies: + boolbase "~1.0.0" + +null-check@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/null-check/-/null-check-1.0.0.tgz#977dffd7176012b9ec30d2a39db5cf72a0439edd" + integrity sha1-l33/1xdgErnsMNKjnbXPcqBDnt0= + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + +object-assign@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2" + integrity sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I= + +object-assign@^4.0.1, object-assign@^4.1.0: + version "4.1.1" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-component@0.0.3: + version "0.0.3" + resolved "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291" + integrity sha1-8MaapQ78lbhmwYb0AKM3acsvEpE= + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-inspect@~1.6.0: + version "1.6.0" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz#c70b6cbf72f274aab4c34c0c82f5167bf82cf15b" + integrity sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ== + +object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.0.6: + version "1.0.12" + resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz#09c53855377575310cca62f55bb334abff7b3ed2" + integrity sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag== + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + dependencies: + isobject "^3.0.0" + +object.assign@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" + integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== + dependencies: + define-properties "^1.1.2" + function-bind "^1.1.1" + has-symbols "^1.0.0" + object-keys "^1.0.11" + +object.getownpropertydescriptors@^2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" + integrity sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY= + dependencies: + define-properties "^1.1.2" + es-abstract "^1.5.1" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + dependencies: + isobject "^3.0.1" + +obuf@^1.0.0, obuf@^1.1.1: + version "1.1.2" + resolved "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" + integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7" + integrity sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c= + +once@1.x, once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +once@~1.3.0: + version "1.3.3" + resolved "https://registry.npmjs.org/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" + integrity sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA= + dependencies: + wrappy "1" + +onetime@^1.0.0: + version "1.1.0" + resolved "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" + integrity sha1-ofeDj4MUxRbwXs78vEzP4EtO14k= + +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= + dependencies: + mimic-fn "^1.0.0" + +open-browser-webpack-plugin@^0.0.5: + version "0.0.5" + resolved "https://registry.npmjs.org/open-browser-webpack-plugin/-/open-browser-webpack-plugin-0.0.5.tgz#5e6dc6f8b8797331e212985de218572d84c0521f" + integrity sha1-Xm3G+Lh5czHiEphd4hhXLYTAUh8= + dependencies: + open "0.0.5" + +open@0.0.5: + version "0.0.5" + resolved "https://registry.npmjs.org/open/-/open-0.0.5.tgz#42c3e18ec95466b6bf0dc42f3a2945c3f0cad8fc" + integrity sha1-QsPhjslUZra/DcQvOilFw/DK2Pw= + +opn@^5.1.0: + version "5.4.0" + resolved "https://registry.npmjs.org/opn/-/opn-5.4.0.tgz#cb545e7aab78562beb11aa3bfabc7042e1761035" + integrity sha512-YF9MNdVy/0qvJvDtunAOzFw9iasOQHpVthTCvGzxt61Il64AYSGdK+rYwld7NAfk9qJ7dt+hymBNSc9LNYS+Sw== + dependencies: + is-wsl "^1.1.0" + +optimist@0.6.1, optimist@^0.6.1: + version "0.6.1" + resolved "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" + integrity sha1-2j6nRob6IaGaERwybpDrFaAZZoY= + dependencies: + minimist "~0.0.1" + wordwrap "~0.0.2" + +optionator@^0.8.1: + version "0.8.2" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" + integrity sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q= + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.4" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + wordwrap "~1.0.0" + +original@>=0.0.5: + version "1.0.2" + resolved "https://registry.npmjs.org/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f" + integrity sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg== + dependencies: + url-parse "^1.4.3" + +os-browserify@^0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= + +os-family@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/os-family/-/os-family-1.0.0.tgz#d12308c424a36302a1c106a95287bbdd5ca2477f" + integrity sha1-0SMIxCSjYwKhwQapUoe73VyiR38= + +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= + +os-locale@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/os-locale/-/os-locale-3.0.1.tgz#3b014fbf01d87f60a1e5348d80fe870dc82c4620" + integrity sha512-7g5e7dmXPtzcP4bgsZ8ixDVqA7oWYuEz4lOSujeWyliPai4gfVDiFIcwBg3aGCPnmSGfzOKTK3ccPn0CKv3DBw== + dependencies: + execa "^0.10.0" + lcid "^2.0.0" + mem "^4.0.0" + +os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + +osenv@0.1.5, osenv@^0.1.4: + version "0.1.5" + resolved "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +p-defer@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" + integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + +p-is-promise@^1.1.0: + version "1.1.0" + resolved "http://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz#9c9456989e9f6588017b0434d56097675c3da05e" + integrity sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4= + +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" + +p-limit@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz#e624ed54ee8c460a778b3c9f3670496ff8a57aec" + integrity sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A== + dependencies: + p-try "^2.0.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= + dependencies: + p-limit "^1.1.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-map@^1.1.1: + version "1.2.0" + resolved "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b" + integrity sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA== + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + +p-try@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz#85080bb87c64688fa47996fe8f7dfbe8211760b1" + integrity sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ== + +package-json@^4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" + integrity sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0= + dependencies: + got "^6.7.1" + registry-auth-token "^3.0.1" + registry-url "^3.0.3" + semver "^5.1.0" + +pako@~1.0.5: + version "1.0.6" + resolved "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258" + integrity sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg== + +parallel-transform@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz#d410f065b05da23081fcd10f28854c29bda33b06" + integrity sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY= + dependencies: + cyclist "~0.2.2" + inherits "^2.0.3" + readable-stream "^2.1.5" + +param-case@2.1.x: + version "2.1.1" + resolved "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz#df94fd8cf6531ecf75e6bef9a0858fbc72be2247" + integrity sha1-35T9jPZTHs915r75oIWPvHK+Ikc= + dependencies: + no-case "^2.2.0" + +parse-asn1@^5.0.0: + version "5.1.1" + resolved "http://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz#f6bf293818332bd0dab54efb16087724745e6ca8" + integrity sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw== + dependencies: + asn1.js "^4.0.0" + browserify-aes "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.0" + pbkdf2 "^3.0.3" + +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= + dependencies: + error-ex "^1.2.0" + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +parseqs@0.0.5: + version "0.0.5" + resolved "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz#d5208a3738e46766e291ba2ea173684921a8b89d" + integrity sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0= + dependencies: + better-assert "~1.0.0" + +parseuri@0.0.5: + version "0.0.5" + resolved "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz#80204a50d4dbb779bfdc6ebe2778d90e4bce320a" + integrity sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo= + dependencies: + better-assert "~1.0.0" + +parseurl@~1.3.2: + version "1.3.2" + resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" + integrity sha1-/CidTtiZMRlGDBViUyYs3I3mW/M= + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + +path-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" + integrity sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo= + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= + +path-exists@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= + dependencies: + pinkie-promise "^2.0.0" + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-is-inside@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= + +path-key@^2.0.0, path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + +path-parse@^1.0.5: + version "1.0.6" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= + +path-to-regexp@^1.7.0: + version "1.7.0" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz#59fde0f435badacba103a84e9d3bc64e96b9937d" + integrity sha1-Wf3g9DW62suhA6hOnTvGTpa5k30= + dependencies: + isarray "0.0.1" + +path-type@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= + dependencies: + graceful-fs "^4.1.2" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== + dependencies: + pify "^3.0.0" + +pathval@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" + integrity sha1-uULm1L3mUwBe9rcTYd74cn0GReA= + +pbkdf2@^3.0.3: + version "3.0.17" + resolved "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6" + integrity sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA= + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + +phantomjs-prebuilt@^2.1.7: + version "2.1.16" + resolved "https://registry.npmjs.org/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.16.tgz#efd212a4a3966d3647684ea8ba788549be2aefef" + integrity sha1-79ISpKOWbTZHaE6ouniFSb4q7+8= + dependencies: + es6-promise "^4.0.3" + extract-zip "^1.6.5" + fs-extra "^1.0.0" + hasha "^2.2.0" + kew "^0.7.0" + progress "^1.1.8" + request "^2.81.0" + request-progress "^2.0.1" + which "^1.2.10" + +pify@^2.0.0: + version "2.3.0" + resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + +pinkie-promise@^2.0.0, pinkie-promise@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= + +pkg-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" + integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= + dependencies: + find-up "^2.1.0" + +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== + dependencies: + find-up "^3.0.0" + +pkgd@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/pkgd/-/pkgd-1.1.2.tgz#69aba6c7292bd2cf03ba7f3e2eaa81c9d3a3e469" + integrity sha1-aaumxykr0s8Dun8+LqqBydOj5Gk= + dependencies: + fstream-npm "^1.0.7" + normalize-path "^2.0.1" + pinkie-promise "^2.0.1" + +plugin-error@^0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz#3b9bb3335ccf00f425e07437e19276967da47ace" + integrity sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4= + dependencies: + ansi-cyan "^0.1.1" + ansi-red "^0.1.1" + arr-diff "^1.0.1" + arr-union "^2.0.1" + extend-shallow "^1.1.2" + +pluralize@7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" + integrity sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow== + +pop-iterate@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/pop-iterate/-/pop-iterate-1.0.1.tgz#ceacfdab4abf353d7a0f2aaa2c1fc7b3f9413ba3" + integrity sha1-zqz9q0q/NT16DyqqLB/Hs/lBO6M= + +portfinder@^1.0.9: + version "1.0.17" + resolved "https://registry.npmjs.org/portfinder/-/portfinder-1.0.17.tgz#a8a1691143e46c4735edefcf4fbcccedad26456a" + integrity sha512-syFcRIRzVI1BoEFOCaAiizwDolh1S1YXSodsVhncbhjzjZQulhczNRbqnUl9N31Q4dKGOXsNDqxC2BWBgSMqeQ== + dependencies: + async "^1.5.2" + debug "^2.2.0" + mkdirp "0.5.x" + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= + +prepend-http@^1.0.1: + version "1.0.4" + resolved "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= + +prettier@^1.14.3: + version "1.14.3" + resolved "https://registry.npmjs.org/prettier/-/prettier-1.14.3.tgz#90238dd4c0684b7edce5f83b0fb7328e48bd0895" + integrity sha512-qZDVnCrnpsRJJq5nSsiHCE3BYMED2OtsI+cmzIzF1QIfqm5ALf8tEJcO27zV1gKNKRPdhjO0dNWnrzssDQ1tFg== + +pretty-error@^2.0.2: + version "2.1.1" + resolved "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz#5f4f87c8f91e5ae3f3ba87ab4cf5e03b1a17f1a3" + integrity sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM= + dependencies: + renderkid "^2.0.1" + utila "~0.4" + +process-nextick-args@~1.0.6: + version "1.0.7" + resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" + integrity sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M= + +process-nextick-args@~2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" + integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.npmjs.org/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= + +progress@^1.1.8: + version "1.1.8" + resolved "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" + integrity sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74= + +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= + +promisify-event@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/promisify-event/-/promisify-event-1.0.0.tgz#bd7523ea06b70162f370979016b53a686c60e90f" + integrity sha1-vXUj6ga3AWLzcJeQFrU6aGxg6Q8= + dependencies: + pinkie-promise "^2.0.0" + +proxy-addr@~2.0.4: + version "2.0.4" + resolved "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz#ecfc733bf22ff8c6f407fa275327b9ab67e48b93" + integrity sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA== + dependencies: + forwarded "~0.1.2" + ipaddr.js "1.8.0" + +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= + +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= + +psl@^1.1.24: + version "1.1.29" + resolved "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz#60f580d360170bb722a797cc704411e6da850c67" + integrity sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ== + +public-encrypt@^4.0.0: + version "4.0.3" + resolved "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + safe-buffer "^5.1.2" + +publish-please@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/publish-please/-/publish-please-4.0.1.tgz#79553fdb220d4fe811c9ea865a58ff4031775c94" + integrity sha512-raHtj4zno7AvrhaC4q/t+OVcYbcBzN4vvYYNqkS7WR8Mq4uZLf1ppvmnkdZgCJx+rfTZQE8/p0uOPN+GCNHciw== + dependencies: + ban-sensitive-files "1.9.2" + chalk "2.4.1" + cp-sugar "^1.0.0" + elegant-status "1.1.0" + globby "8.0.1" + inquirer "6.2.0" + lodash "4.17.10" + node-emoji "1.8.1" + osenv "0.1.5" + pinkie-promise "^2.0.1" + pkgd "^1.1.2" + promisify-event "^1.0.0" + read-pkg "3.0.0" + semver "5.5.0" + +pump@^2.0.0, pump@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" + integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pumpify@^1.3.3: + version "1.5.1" + resolved "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" + integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== + dependencies: + duplexify "^3.6.0" + inherits "^2.0.3" + pump "^2.0.0" + +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= + +punycode@^1.2.4, punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= + +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +q@2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/q/-/q-2.0.3.tgz#75b8db0255a1a5af82f58c3f3aaa1efec7d0d134" + integrity sha1-dbjbAlWhpa+C9Yw/Oqoe/sfQ0TQ= + dependencies: + asap "^2.0.0" + pop-iterate "^1.0.1" + weak-map "^1.0.5" + +qjobs@^1.1.4: + version "1.2.0" + resolved "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz#c45e9c61800bd087ef88d7e256423bdd49e5d071" + integrity sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg== + +qs@6.5.2, qs@~6.5.2: + version "6.5.2" + resolved "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== + +querystring-es3@^0.2.0: + version "0.2.1" + resolved "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= + +querystringify@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/querystringify/-/querystringify-2.1.0.tgz#7ded8dfbf7879dcc60d0a644ac6754b283ad17ef" + integrity sha512-sluvZZ1YiTLD5jsqZcDmFyV2EwToyXZBfpoVOmktMmW+VEnhgakFHnasVph65fOjGPTWN0Nw3+XQaSeMayr0kg== + +quote@0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/quote/-/quote-0.4.0.tgz#10839217f6c1362b89194044d29b233fd7f32f01" + integrity sha1-EIOSF/bBNiuJGUBE0psjP9fzLwE= + +ramda@0.25.0: + version "0.25.0" + resolved "https://registry.npmjs.org/ramda/-/ramda-0.25.0.tgz#8fdf68231cffa90bc2f9460390a0cb74a29b29a9" + integrity sha512-GXpfrYVPwx3K7RQ6aYT8KPS8XViSXUVJT1ONhoKPE9VAleW42YE+U+8VEyGWt41EnEQW7gwecYJriTI0pKoecQ== + +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: + version "2.0.6" + resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz#d302c522948588848a8d300c932b44c24231da80" + integrity sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A== + dependencies: + safe-buffer "^5.1.0" + +randomfill@^1.0.3: + version "1.0.4" + resolved "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + +range-parser@^1.0.3, range-parser@^1.2.0, range-parser@~1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" + integrity sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4= + +raw-body@2.3.3: + version "2.3.3" + resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz#1b324ece6b5706e153855bc1148c65bb7f6ea0c3" + integrity sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw== + dependencies: + bytes "3.0.0" + http-errors "1.6.3" + iconv-lite "0.4.23" + unpipe "1.0.0" + +rc@^1.0.1, rc@^1.1.6, rc@^1.2.7: + version "1.2.8" + resolved "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +read-pkg-up@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" + integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= + dependencies: + find-up "^1.0.0" + read-pkg "^1.0.0" + +read-pkg@3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" + integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= + dependencies: + load-json-file "^4.0.0" + normalize-package-data "^2.3.2" + path-type "^3.0.0" + +read-pkg@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" + integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= + dependencies: + load-json-file "^1.0.0" + normalize-package-data "^2.3.2" + path-type "^1.0.0" + +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.2.9, readable-stream@^2.3.0, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6: + version "2.3.6" + resolved "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" + integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@1.0, "readable-stream@>=1.0.33-1 <1.1.0-0": + version "1.0.34" + resolved "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" + integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw= + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readable-stream@~1.1.9: + version "1.1.14" + resolved "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" + integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk= + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readable-stream@~2.0.0: + version "2.0.6" + resolved "http://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e" + integrity sha1-j5A0HmilPMySh4jaz80Rs265t44= + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + string_decoder "~0.10.x" + util-deprecate "~1.0.1" + +readdirp@^2.0.0: + version "2.2.1" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== + dependencies: + graceful-fs "^4.1.11" + micromatch "^3.1.10" + readable-stream "^2.0.2" + +redent@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" + integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94= + dependencies: + indent-string "^2.1.0" + strip-indent "^1.0.1" + +reflect-metadata@^0.1.12: + version "0.1.12" + resolved "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.12.tgz#311bf0c6b63cd782f228a81abe146a2bfa9c56f2" + integrity sha512-n+IyV+nGz3+0q3/Yf1ra12KpCyi001bi4XFxSjbiWWjfqb52iTTtpGXmCCAOWWIAn9KEuFZKGqBERHmrtScZ3A== + +regenerator-runtime@^0.11.0: + version "0.11.1" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +registry-auth-token@^3.0.1: + version "3.3.2" + resolved "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz#851fd49038eecb586911115af845260eec983f20" + integrity sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ== + dependencies: + rc "^1.1.6" + safe-buffer "^5.0.1" + +registry-url@^3.0.3: + version "3.1.0" + resolved "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" + integrity sha1-PU74cPc93h138M+aOBQyRE4XSUI= + dependencies: + rc "^1.0.1" + +relateurl@0.2.x: + version "0.2.7" + resolved "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" + integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= + +remap-istanbul@^0.12.0: + version "0.12.0" + resolved "https://registry.npmjs.org/remap-istanbul/-/remap-istanbul-0.12.0.tgz#7215642017d01a8c4a51bdb41be35297ec71fc4e" + integrity sha512-lpA+zkWfT7v81k76asd+w82+dnbBTmBEsyuBVQ28armnOqsZZO23uI4ZCBGd8TtIb9Tq4CauswB+A44cbkuiMA== + dependencies: + amdefine "^1.0.0" + istanbul "0.4.5" + minimatch "^3.0.3" + plugin-error "^0.1.2" + source-map "^0.6.1" + through2 "2.0.1" + +remap-istanbul@^0.9.0: + version "0.9.6" + resolved "https://registry.npmjs.org/remap-istanbul/-/remap-istanbul-0.9.6.tgz#bbd5a688fe265192f067a0ca5b2b0d7f746c5f4b" + integrity sha512-l0WDBsVjaTzP8m3glERJO6bjlAFUahcgfcgvcX+owZw7dKeDLT3CVRpS7UO4L9LfGcMiNsqk223HopwVxlh8Hg== + dependencies: + amdefine "^1.0.0" + gulp-util "3.0.7" + istanbul "0.4.5" + minimatch "^3.0.3" + source-map "^0.6.1" + through2 "2.0.1" + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= + +renderkid@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/renderkid/-/renderkid-2.0.2.tgz#12d310f255360c07ad8fde253f6c9e9de372d2aa" + integrity sha512-FsygIxevi1jSiPY9h7vZmBFUbAOcbYm9UwyiLNdVsLRs/5We9Ob5NMPbGYUTWiLq5L+ezlVdE0A8bbME5CWTpg== + dependencies: + css-select "^1.1.0" + dom-converter "~0.2" + htmlparser2 "~3.3.0" + strip-ansi "^3.0.0" + utila "^0.4.0" + +repeat-element@^1.1.2: + version "1.1.3" + resolved "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" + integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== + +repeat-string@^0.2.2: + version "0.2.2" + resolved "https://registry.npmjs.org/repeat-string/-/repeat-string-0.2.2.tgz#c7a8d3236068362059a7e4651fc6884e8b1fb4ae" + integrity sha1-x6jTI2BoNiBZp+RlH8aITosftK4= + +repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= + dependencies: + is-finite "^1.0.0" + +replace-ext@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924" + integrity sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ= + +request-progress@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/request-progress/-/request-progress-2.0.1.tgz#5d36bb57961c673aa5b788dbc8141fdf23b44e08" + integrity sha1-XTa7V5YcZzqlt4jbyBQf3yO0Tgg= + dependencies: + throttleit "^1.0.0" + +request@^2.81.0: + version "2.88.0" + resolved "https://registry.npmjs.org/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" + integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.0" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.4.3" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +require-main-filename@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" + integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= + +resolve-cwd@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" + integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= + dependencies: + resolve-from "^3.0.0" + +resolve-from@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + integrity sha1-six699nWiBvItuZTM17rywoYh0g= + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + +resolve@1.1.x: + version "1.1.7" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= + +resolve@^0.6.1: + version "0.6.3" + resolved "https://registry.npmjs.org/resolve/-/resolve-0.6.3.tgz#dd957982e7e736debdf53b58a4dd91754575dd46" + integrity sha1-3ZV5gufnNt699TtYpN2RdUV13UY= + +resolve@^1.0.0, resolve@^1.1.5, resolve@^1.3.2: + version "1.8.1" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" + integrity sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA== + dependencies: + path-parse "^1.0.5" + +resolve@~1.7.1: + version "1.7.1" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz#aadd656374fd298aee895bc026b8297418677fd3" + integrity sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw== + dependencies: + path-parse "^1.0.5" + +restore-cursor@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" + integrity sha1-NGYfRohjJ/7SmRR5FSJS35LapUE= + dependencies: + exit-hook "^1.0.0" + onetime "^1.0.0" + +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + +resumer@~0.0.0: + version "0.0.0" + resolved "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz#f1e8f461e4064ba39e82af3cdc2a8c893d076759" + integrity sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k= + dependencies: + through "~2.3.4" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + +rfdc@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/rfdc/-/rfdc-1.1.2.tgz#e6e72d74f5dc39de8f538f65e00c36c18018e349" + integrity sha512-92ktAgvZhBzYTIK0Mja9uen5q5J3NRVMoDkJL2VMwq6SXjVCgqvQeVP2XAaUY6HT+XpQYeLSjb3UoitBryKmdA== + +rimraf@2, rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.0, rimraf@^2.6.1, rimraf@^2.6.2: + version "2.6.2" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" + integrity sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w== + dependencies: + glob "^7.0.5" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +run-async@^2.2.0: + version "2.3.0" + resolved "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" + integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA= + dependencies: + is-promise "^2.1.0" + +run-queue@^1.0.0, run-queue@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" + integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec= + dependencies: + aproba "^1.1.1" + +rxjs@^6.1.0: + version "6.3.3" + resolved "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz#3c6a7fa420e844a81390fb1158a9ec614f4bad55" + integrity sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw== + dependencies: + tslib "^1.9.0" + +safe-buffer@5.1.2, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +samsam@1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/samsam/-/samsam-1.3.0.tgz#8d1d9350e25622da30de3e44ba692b5221ab7c50" + integrity sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg== + +sax@^1.2.4: + version "1.2.4" + resolved "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +schema-utils@^0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz#f5877222ce3e931edae039f17eb3716e7137f8cf" + integrity sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8= + dependencies: + ajv "^5.0.0" + +schema-utils@^0.4.4, schema-utils@^0.4.5: + version "0.4.7" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz#ba74f597d2be2ea880131746ee17d0a093c68187" + integrity sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ== + dependencies: + ajv "^6.1.0" + ajv-keywords "^3.1.0" + +schema-utils@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" + integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== + dependencies: + ajv "^6.1.0" + ajv-errors "^1.0.0" + ajv-keywords "^3.1.0" + +select-hose@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" + integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= + +selfsigned@^1.9.1: + version "1.10.4" + resolved "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.4.tgz#cdd7eccfca4ed7635d47a08bf2d5d3074092e2cd" + integrity sha512-9AukTiDmHXGXWtWjembZ5NDmVvP2695EtpgbCsxCa68w3c88B+alqbmZ4O3hZ4VWGXeGWzEVdvqgAJD8DQPCDw== + dependencies: + node-forge "0.7.5" + +semver-diff@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" + integrity sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY= + dependencies: + semver "^5.0.3" + +"semver@2 || 3 || 4 || 5", semver@^5.0.1, semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.5.0: + version "5.6.0" + resolved "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" + integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== + +semver@5.4.1: + version "5.4.1" + resolved "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" + integrity sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg== + +semver@5.5.0: + version "5.5.0" + resolved "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" + integrity sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA== + +send@0.16.2: + version "0.16.2" + resolved "https://registry.npmjs.org/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" + integrity sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw== + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.6.2" + mime "1.4.1" + ms "2.0.0" + on-finished "~2.3.0" + range-parser "~1.2.0" + statuses "~1.4.0" + +serialize-javascript@^1.4.0: + version "1.5.0" + resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.5.0.tgz#1aa336162c88a890ddad5384baebc93a655161fe" + integrity sha512-Ga8c8NjAAp46Br4+0oZ2WxJCwIzwP60Gq1YPgU+39PiTVxyed/iKE/zyZI6+UlVYH5Q4PaQdHhcegIFPZTUfoQ== + +serve-index@^1.7.2: + version "1.9.1" + resolved "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" + integrity sha1-03aNabHn2C5c4FD/9bRTvqEqkjk= + dependencies: + accepts "~1.3.4" + batch "0.6.1" + debug "2.6.9" + escape-html "~1.0.3" + http-errors "~1.6.2" + mime-types "~2.1.17" + parseurl "~1.3.2" + +serve-static@1.13.2: + version "1.13.2" + resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1" + integrity sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.2" + send "0.16.2" + +set-blocking@^2.0.0, set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + +set-value@^0.4.3: + version "0.4.3" + resolved "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" + integrity sha1-fbCPnT0i3H945Trzw79GZuzfzPE= + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.1" + to-object-path "^0.3.0" + +set-value@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" + integrity sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +setimmediate@^1.0.4: + version "1.0.5" + resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== + +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +shallow-copy@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz#415f42702d73d810330292cc5ee86eae1a11a170" + integrity sha1-QV9CcC1z2BAzApLMXuhurhoRoXA= + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + dependencies: + shebang-regex "^1.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + +shell-quote@^1.4.3: + version "1.6.1" + resolved "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f481767" + integrity sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c= + dependencies: + array-filter "~0.0.0" + array-map "~0.0.0" + array-reduce "~0.0.0" + jsonify "~0.0.0" + +signal-exit@^3.0.0, signal-exit@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= + +sinon-chai@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/sinon-chai/-/sinon-chai-3.2.0.tgz#ed995e13a8a3cfccec18f218d9b767edc47e0715" + integrity sha512-Z72B4a0l0IQe5uWi9yzcqX/Ml6K9e1Hp03NmkjJnRG3gDsKTX7KvLFZsVUmCaz0eqeXLLK089mwTsP1P1W+DUQ== + +sinon@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/sinon/-/sinon-5.1.1.tgz#19c59810ffb733ea6e76a28b94a71fc4c2f523b8" + integrity sha512-h/3uHscbt5pQNxkf7Y/Lb9/OM44YNCicHakcq73ncbrIS8lXg+ZGOZbtuU+/km4YnyiCYfQQEwANaReJz7KDfw== + dependencies: + "@sinonjs/formatio" "^2.0.0" + diff "^3.5.0" + lodash.get "^4.4.2" + lolex "^2.4.2" + nise "^1.3.3" + supports-color "^5.4.0" + type-detect "^4.0.8" + +slash@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +socket.io-adapter@~1.1.0: + version "1.1.1" + resolved "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz#2a805e8a14d6372124dd9159ad4502f8cb07f06b" + integrity sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs= + +socket.io-client@2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.1.1.tgz#dcb38103436ab4578ddb026638ae2f21b623671f" + integrity sha512-jxnFyhAuFxYfjqIgduQlhzqTcOEQSn+OHKVfAxWaNWa7ecP7xSNk2Dx/3UEsDcY7NcFafxvNvKPmmO7HTwTxGQ== + dependencies: + backo2 "1.0.2" + base64-arraybuffer "0.1.5" + component-bind "1.0.0" + component-emitter "1.2.1" + debug "~3.1.0" + engine.io-client "~3.2.0" + has-binary2 "~1.0.2" + has-cors "1.1.0" + indexof "0.0.1" + object-component "0.0.3" + parseqs "0.0.5" + parseuri "0.0.5" + socket.io-parser "~3.2.0" + to-array "0.1.4" + +socket.io-parser@~3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.2.0.tgz#e7c6228b6aa1f814e6148aea325b51aa9499e077" + integrity sha512-FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA== + dependencies: + component-emitter "1.2.1" + debug "~3.1.0" + isarray "2.0.1" + +socket.io@2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/socket.io/-/socket.io-2.1.1.tgz#a069c5feabee3e6b214a75b40ce0652e1cfb9980" + integrity sha512-rORqq9c+7W0DAK3cleWNSyfv/qKXV99hV4tZe+gGLfBECw3XEhBy7x85F3wypA9688LKjtwO9pX9L33/xQI8yA== + dependencies: + debug "~3.1.0" + engine.io "~3.2.0" + has-binary2 "~1.0.2" + socket.io-adapter "~1.1.0" + socket.io-client "2.1.1" + socket.io-parser "~3.2.0" + +sockjs-client@1.1.5: + version "1.1.5" + resolved "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.5.tgz#1bb7c0f7222c40f42adf14f4442cbd1269771a83" + integrity sha1-G7fA9yIsQPQq3xT0RCy9Eml3GoM= + dependencies: + debug "^2.6.6" + eventsource "0.1.6" + faye-websocket "~0.11.0" + inherits "^2.0.1" + json3 "^3.3.2" + url-parse "^1.1.8" + +sockjs@0.3.19: + version "0.3.19" + resolved "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz#d976bbe800af7bd20ae08598d582393508993c0d" + integrity sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw== + dependencies: + faye-websocket "^0.10.0" + uuid "^3.0.1" + +source-list-map@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" + integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== + +source-map-resolve@^0.5.0: + version "0.5.2" + resolved "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" + integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA== + dependencies: + atob "^2.1.1" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-support@^0.5.6: + version "0.5.9" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz#41bc953b2534267ea2d605bccfa7bfa3111ced5f" + integrity sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-url@^0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= + +source-map@^0.5.0, source-map@^0.5.6, source-map@^0.5.7: + version "0.5.7" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@~0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" + integrity sha1-2rc/vPwrqBm03gO9b26qSBZLP50= + dependencies: + amdefine ">=0.0.4" + +sparkles@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz#008db65edce6c50eec0c5e228e1945061dd0437c" + integrity sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw== + +spdx-correct@^3.0.0: + version "3.0.2" + resolved "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.2.tgz#19bb409e91b47b1ad54159243f7312a858db3c2e" + integrity sha512-q9hedtzyXHr5S0A1vEPoK/7l8NpfkFYTq6iCY+Pno2ZbdZR6WexZFtqeVGkGxW3TEJMN914Z55EnAGMmenlIQQ== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.2.0" + resolved "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" + integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== + +spdx-expression-parse@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" + integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.1.tgz#e2a303236cac54b04031fa7a5a79c7e701df852f" + integrity sha512-TfOfPcYGBB5sDuPn3deByxPhmfegAhpDYKSOXZQN81Oyrrif8ZCodOLzK3AesELnCx03kikhyDwh0pfvvQvF8w== + +spdy-transport@^2.0.18: + version "2.1.0" + resolved "https://registry.npmjs.org/spdy-transport/-/spdy-transport-2.1.0.tgz#4bbb15aaffed0beefdd56ad61dbdc8ba3e2cb7a1" + integrity sha512-bpUeGpZcmZ692rrTiqf9/2EUakI6/kXX1Rpe0ib/DyOzbiexVfXkw6GnvI9hVGvIwVaUhkaBojjCZwLNRGQg1g== + dependencies: + debug "^2.6.8" + detect-node "^2.0.3" + hpack.js "^2.1.6" + obuf "^1.1.1" + readable-stream "^2.2.9" + safe-buffer "^5.0.1" + wbuf "^1.7.2" + +spdy@^3.4.1: + version "3.4.7" + resolved "https://registry.npmjs.org/spdy/-/spdy-3.4.7.tgz#42ff41ece5cc0f99a3a6c28aabb73f5c3b03acbc" + integrity sha1-Qv9B7OXMD5mjpsKKq7c/XDsDrLw= + dependencies: + debug "^2.6.8" + handle-thing "^1.2.5" + http-deceiver "^1.2.7" + safe-buffer "^5.0.1" + select-hose "^2.0.0" + spdy-transport "^2.0.18" + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + +sshpk@^1.7.0: + version "1.14.2" + resolved "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz#c6fc61648a3d9c4e764fd3fcdf4ea105e492ba98" + integrity sha1-xvxhZIo9nE52T9P8306hBeSSupg= + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + dashdash "^1.12.0" + getpass "^0.1.1" + safer-buffer "^2.0.2" + optionalDependencies: + bcrypt-pbkdf "^1.0.0" + ecc-jsbn "~0.1.1" + jsbn "~0.1.0" + tweetnacl "~0.14.0" + +ssri@^5.2.4: + version "5.3.0" + resolved "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz#ba3872c9c6d33a0704a7d71ff045e5ec48999d06" + integrity sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ== + dependencies: + safe-buffer "^5.1.1" + +ssri@^6.0.0: + version "6.0.1" + resolved "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" + integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA== + dependencies: + figgy-pudding "^3.5.1" + +stack-trace@0.0.9: + version "0.0.9" + resolved "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.9.tgz#a8f6eaeca90674c333e7c43953f275b451510695" + integrity sha1-qPbq7KkGdMMz58Q5U/J1tFFRBpU= + +static-eval@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/static-eval/-/static-eval-2.0.0.tgz#0e821f8926847def7b4b50cda5d55c04a9b13864" + integrity sha512-6flshd3F1Gwm+Ksxq463LtFd1liC77N/PX1FVVc3OzL3hAmo2fwHFbuArkcfi7s9rTNsLEhcRmXGFZhlgy40uw== + dependencies: + escodegen "^1.8.1" + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +"statuses@>= 1.4.0 < 2": + version "1.5.0" + resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +statuses@~1.3.1: + version "1.3.1" + resolved "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" + integrity sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4= + +statuses@~1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" + integrity sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew== + +stream-browserify@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db" + integrity sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds= + dependencies: + inherits "~2.0.1" + readable-stream "^2.0.2" + +stream-each@^1.1.0: + version "1.2.3" + resolved "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" + integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== + dependencies: + end-of-stream "^1.1.0" + stream-shift "^1.0.0" + +stream-http@^2.7.2: + version "2.8.3" + resolved "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" + integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.1" + readable-stream "^2.3.6" + to-arraybuffer "^1.0.0" + xtend "^4.0.0" + +stream-shift@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" + integrity sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI= + +streamroller@0.7.0: + version "0.7.0" + resolved "https://registry.npmjs.org/streamroller/-/streamroller-0.7.0.tgz#a1d1b7cf83d39afb0d63049a5acbf93493bdf64b" + integrity sha512-WREzfy0r0zUqp3lGO096wRuUp7ho1X6uo/7DJfTlEi0Iv/4gT7YHqXDjKC2ioVGBZtE8QzsQD9nx1nIuoZ57jQ== + dependencies: + date-format "^1.2.0" + debug "^3.1.0" + mkdirp "^0.5.1" + readable-stream "^2.3.0" + +string-width@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string.prototype.trim@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz#d04de2c89e137f4d7d206f086b5ed2fae6be8cea" + integrity sha1-0E3iyJ4Tf019IG8Ia17S+ua+jOo= + dependencies: + define-properties "^1.1.2" + es-abstract "^1.5.0" + function-bind "^1.0.2" + +string_decoder@^1.0.0, string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + +strip-bom@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= + dependencies: + is-utf8 "^0.2.0" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + +strip-indent@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" + integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI= + dependencies: + get-stdin "^4.0.1" + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + +supports-color@5.4.0: + version "5.4.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54" + integrity sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w== + dependencies: + has-flag "^3.0.0" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= + +supports-color@^3.1.0: + version "3.2.3" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" + integrity sha1-ZawFBLOVQXHYpklGsq48u4pfVPY= + dependencies: + has-flag "^1.0.0" + +supports-color@^5.1.0, supports-color@^5.3.0, supports-color@^5.4.0, supports-color@^5.5.0: + version "5.5.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +tapable@^1.0.0, tapable@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/tapable/-/tapable-1.1.0.tgz#0d076a172e3d9ba088fd2272b2668fb8d194b78c" + integrity sha512-IlqtmLVaZA2qab8epUXbVWRn3aB1imbDMJtjB3nu4X0NqPkcY/JH9ZtCBWKHWPxs8Svi9tyo8w2dBoi07qZbBA== + +tape@^4.6.0: + version "4.9.1" + resolved "https://registry.npmjs.org/tape/-/tape-4.9.1.tgz#1173d7337e040c76fbf42ec86fcabedc9b3805c9" + integrity sha512-6fKIXknLpoe/Jp4rzHKFPpJUHDHDqn8jus99IfPnHIjyz78HYlefTGD3b5EkbQzuLfaEvmfPK3IolLgq2xT3kw== + dependencies: + deep-equal "~1.0.1" + defined "~1.0.0" + for-each "~0.3.3" + function-bind "~1.1.1" + glob "~7.1.2" + has "~1.0.3" + inherits "~2.0.3" + minimist "~1.2.0" + object-inspect "~1.6.0" + resolve "~1.7.1" + resumer "~0.0.0" + string.prototype.trim "~1.1.2" + through "~2.3.8" + +tar@^4: + version "4.4.6" + resolved "https://registry.npmjs.org/tar/-/tar-4.4.6.tgz#63110f09c00b4e60ac8bcfe1bf3c8660235fbc9b" + integrity sha512-tMkTnh9EdzxyfW+6GK6fCahagXsnYk6kE6S9Gr9pjVdys769+laCTbodXDhPAjzVtEBazRgP0gYqOjnk9dQzLg== + dependencies: + chownr "^1.0.1" + fs-minipass "^1.2.5" + minipass "^2.3.3" + minizlib "^1.1.0" + mkdirp "^0.5.0" + safe-buffer "^5.1.2" + yallist "^3.0.2" + +term-size@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" + integrity sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk= + dependencies: + execa "^0.7.0" + +text-encoding@^0.6.4: + version "0.6.4" + resolved "http://registry.npmjs.org/text-encoding/-/text-encoding-0.6.4.tgz#e399a982257a276dae428bb92845cb71bdc26d19" + integrity sha1-45mpgiV6J22uQou5KEXLcb3CbRk= + +throttleit@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c" + integrity sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw= + +through2@0.6.3: + version "0.6.3" + resolved "https://registry.npmjs.org/through2/-/through2-0.6.3.tgz#795292fde9f254c2a368b38f9cc5d1bd4663afb6" + integrity sha1-eVKS/enyVMKjaLOPnMXRvUZjr7Y= + dependencies: + readable-stream ">=1.0.33-1 <1.1.0-0" + xtend ">=4.0.0 <4.1.0-0" + +through2@2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/through2/-/through2-2.0.1.tgz#384e75314d49f32de12eebb8136b8eb6b5d59da9" + integrity sha1-OE51MU1J8y3hLuu4E2uOtrXVnak= + dependencies: + readable-stream "~2.0.0" + xtend "~4.0.0" + +through2@^0.6.3: + version "0.6.5" + resolved "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48" + integrity sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg= + dependencies: + readable-stream ">=1.0.33-1 <1.1.0-0" + xtend ">=4.0.0 <4.1.0-0" + +through2@^2.0.0, through2@^2.0.1: + version "2.0.3" + resolved "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" + integrity sha1-AARWmzfHx0ujnEPzzteNGtlBQL4= + dependencies: + readable-stream "^2.1.5" + xtend "~4.0.1" + +through@^2.3.6, through@~2.3.4, through@~2.3.8: + version "2.3.8" + resolved "http://registry.npmjs.org/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + +thunky@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/thunky/-/thunky-1.0.2.tgz#a862e018e3fb1ea2ec3fce5d55605cf57f247371" + integrity sha1-qGLgGOP7HqLsP85dVWBc9X8kc3E= + +time-stamp@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3" + integrity sha1-dkpaEa9QVhkhsTPztE5hhofg9cM= + +timed-out@^4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" + integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= + +timers-browserify@^2.0.4: + version "2.0.10" + resolved "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz#1d28e3d2aadf1d5a5996c4e9f95601cd053480ae" + integrity sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg== + dependencies: + setimmediate "^1.0.4" + +tmp@0.0.33, tmp@0.0.x, tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +to-array@0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890" + integrity sha1-F+bBH3PdTz10zaek/zI46a2b+JA= + +to-arraybuffer@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= + +to-fast-properties@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" + integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc= + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +toposort@^1.0.0: + version "1.0.7" + resolved "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz#2e68442d9f64ec720b8cc89e6443ac6caa950029" + integrity sha1-LmhELZ9k7HILjMieZEOsbKqVACk= + +tough-cookie@~2.4.3: + version "2.4.3" + resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" + integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== + dependencies: + psl "^1.1.24" + punycode "^1.4.1" + +trim-newlines@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" + integrity sha1-WIeWa7WCpFA6QetST301ARgVphM= + +trim-right@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= + +ts-loader@^5.2.1: + version "5.2.1" + resolved "https://registry.npmjs.org/ts-loader/-/ts-loader-5.2.1.tgz#e6815c631dcafc24319ce8be6f8af94908749cf3" + integrity sha512-KC0cOvsFVyxBlg5h9jvaMlIL2tNsyQLvT2/OvIlO0AMUBJ4iXTtOfaDEqvmqv2lM/icekQfDsP2PsYBCDHpuOQ== + dependencies: + chalk "^2.3.0" + enhanced-resolve "^4.0.0" + loader-utils "^1.0.2" + micromatch "^3.1.4" + semver "^5.0.1" + +ts-node@^7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz#9562dc2d1e6d248d24bc55f773e3f614337d9baf" + integrity sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw== + dependencies: + arrify "^1.0.0" + buffer-from "^1.1.0" + diff "^3.1.0" + make-error "^1.1.1" + minimist "^1.2.0" + mkdirp "^0.5.1" + source-map-support "^0.5.6" + yn "^2.0.0" + +tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: + version "1.9.3" + resolved "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" + integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ== + +tslint-config-prettier@^1.15.0: + version "1.15.0" + resolved "https://registry.npmjs.org/tslint-config-prettier/-/tslint-config-prettier-1.15.0.tgz#76b9714399004ab6831fdcf76d89b73691c812cf" + integrity sha512-06CgrHJxJmNYVgsmeMoa1KXzQRoOdvfkqnJth6XUkNeOz707qxN0WfxfhYwhL5kXHHbYJRby2bqAPKwThlZPhw== + +tslint@^5.11.0: + version "5.11.0" + resolved "https://registry.npmjs.org/tslint/-/tslint-5.11.0.tgz#98f30c02eae3cde7006201e4c33cb08b48581eed" + integrity sha1-mPMMAurjzecAYgHkwzywi0hYHu0= + dependencies: + babel-code-frame "^6.22.0" + builtin-modules "^1.1.1" + chalk "^2.3.0" + commander "^2.12.1" + diff "^3.2.0" + glob "^7.1.1" + js-yaml "^3.7.0" + minimatch "^3.0.4" + resolve "^1.3.2" + semver "^5.3.0" + tslib "^1.8.0" + tsutils "^2.27.2" + +tsutils@^2.27.2: + version "2.29.0" + resolved "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99" + integrity sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA== + dependencies: + tslib "^1.8.1" + +tty-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= + dependencies: + prelude-ls "~1.1.2" + +type-detect@^4.0.0, type-detect@^4.0.5, type-detect@^4.0.8: + version "4.0.8" + resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + +type-is@~1.6.16: + version "1.6.16" + resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" + integrity sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.18" + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= + +typescript@^3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/typescript/-/typescript-3.1.2.tgz#c03a5d16f30bb60ad8bb6fe8e7cb212eedeec950" + integrity sha512-gOoGJWbNnFAfP9FlrSV63LYD5DJqYJHG5ky1kOXSl3pCImn4rqWy/flyq1BRd4iChQsoCqjbQaqtmXO4yCVPCA== + +uglify-es@^3.3.4, uglify-es@^3.3.9: + version "3.3.9" + resolved "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677" + integrity sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ== + dependencies: + commander "~2.13.0" + source-map "~0.6.1" + +uglify-js@3.4.x, uglify-js@^3.0.0, uglify-js@^3.1.4: + version "3.4.9" + resolved "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz#af02f180c1207d76432e473ed24a28f4a782bae3" + integrity sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q== + dependencies: + commander "~2.17.1" + source-map "~0.6.1" + +uglifyjs-webpack-plugin@^1.2.4: + version "1.3.0" + resolved "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.3.0.tgz#75f548160858163a08643e086d5fefe18a5d67de" + integrity sha512-ovHIch0AMlxjD/97j9AYovZxG5wnHOPkL7T1GKochBADp/Zwc44pEWNqpKl1Loupp1WhFg7SlYmHZRUfdAacgw== + dependencies: + cacache "^10.0.4" + find-cache-dir "^1.0.0" + schema-utils "^0.4.5" + serialize-javascript "^1.4.0" + source-map "^0.6.1" + uglify-es "^3.3.4" + webpack-sources "^1.1.0" + worker-farm "^1.5.2" + +uglifyjs-webpack-plugin@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-2.0.1.tgz#f346af53ed496ce72fef462517d417f62bec3010" + integrity sha512-1HhCHkOB6wRCcv7htcz1QRPVbWPEY074RP9vzt/X0LF4xXm9l4YGd0qja7z88abDixQlnVwBjXsTBs+Xsn/eeQ== + dependencies: + cacache "^11.2.0" + find-cache-dir "^2.0.0" + schema-utils "^1.0.0" + serialize-javascript "^1.4.0" + source-map "^0.6.1" + uglify-js "^3.0.0" + webpack-sources "^1.1.0" + worker-farm "^1.5.2" + +ultron@~1.1.0: + version "1.1.1" + resolved "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c" + integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og== + +union-value@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" + integrity sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ= + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^0.4.3" + +unique-filename@^1.1.0: + version "1.1.1" + resolved "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== + dependencies: + unique-slug "^2.0.0" + +unique-slug@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.1.tgz#5e9edc6d1ce8fb264db18a507ef9bd8544451ca6" + integrity sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg== + dependencies: + imurmurhash "^0.1.4" + +unique-string@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" + integrity sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo= + dependencies: + crypto-random-string "^1.0.0" + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +unzip-response@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" + integrity sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c= + +upath@^1.0.5, upath@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd" + integrity sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw== + +update-notifier@2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/update-notifier/-/update-notifier-2.3.0.tgz#4e8827a6bb915140ab093559d7014e3ebb837451" + integrity sha1-TognpruRUUCrCTVZ1wFOPruDdFE= + dependencies: + boxen "^1.2.1" + chalk "^2.0.1" + configstore "^3.0.0" + import-lazy "^2.1.0" + is-installed-globally "^0.1.0" + is-npm "^1.0.0" + latest-version "^3.0.0" + semver-diff "^2.0.0" + xdg-basedir "^3.0.0" + +upper-case@^1.1.1: + version "1.1.3" + resolved "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" + integrity sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg= + +uri-js@^4.2.2: + version "4.2.2" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" + integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== + dependencies: + punycode "^2.1.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + +url-join@^2.0.2: + version "2.0.5" + resolved "https://registry.npmjs.org/url-join/-/url-join-2.0.5.tgz#5af22f18c052a000a48d7b82c5e9c2e2feeda728" + integrity sha1-WvIvGMBSoACkjXuCxenC4v7tpyg= + +url-parse-lax@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" + integrity sha1-evjzA2Rem9eaJy56FKxovAYJ2nM= + dependencies: + prepend-http "^1.0.1" + +url-parse@^1.1.8, url-parse@^1.4.3: + version "1.4.3" + resolved "https://registry.npmjs.org/url-parse/-/url-parse-1.4.3.tgz#bfaee455c889023219d757e045fa6a684ec36c15" + integrity sha512-rh+KuAW36YKo0vClhQzLLveoj8FwPJNu65xLb7Mrt+eZht0IPT0IXgSv8gcMegZ6NvjJUALf6Mf25POlMwD1Fw== + dependencies: + querystringify "^2.0.0" + requires-port "^1.0.0" + +url@^0.11.0: + version "0.11.0" + resolved "https://registry.npmjs.org/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.npmjs.org/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + +useragent@2.2.1: + version "2.2.1" + resolved "https://registry.npmjs.org/useragent/-/useragent-2.2.1.tgz#cf593ef4f2d175875e8bb658ea92e18a4fd06d8e" + integrity sha1-z1k+9PLRdYdei7ZY6pLhik/QbY4= + dependencies: + lru-cache "2.2.x" + tmp "0.0.x" + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +util.promisify@1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" + integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA== + dependencies: + define-properties "^1.1.2" + object.getownpropertydescriptors "^2.0.3" + +util@0.10.3: + version "0.10.3" + resolved "https://registry.npmjs.org/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= + dependencies: + inherits "2.0.1" + +util@^0.10.3: + version "0.10.4" + resolved "https://registry.npmjs.org/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901" + integrity sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A== + dependencies: + inherits "2.0.3" + +utila@^0.4.0, utila@~0.4: + version "0.4.0" + resolved "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" + integrity sha1-ihagXURWV6Oupe7MWxKk+lN5dyw= + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + +uuid@^3.0.1, uuid@^3.1.0, uuid@^3.3.2: + version "3.3.2" + resolved "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" + integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== + +v8-compile-cache@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.2.tgz#a428b28bb26790734c4fc8bc9fa106fccebf6a6c" + integrity sha512-1wFuMUIM16MDJRCrpbpuEPTUGmM5QMUg0cr3KFwra2XgOgFcPGDQHDh3CszSCD2Zewc/dh/pamNEW8CbfDebUw== + +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +vinyl@^0.5.0: + version "0.5.3" + resolved "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz#b0455b38fc5e0cf30d4325132e461970c2091cde" + integrity sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4= + dependencies: + clone "^1.0.0" + clone-stats "^0.0.1" + replace-ext "0.0.1" + +vm-browserify@0.0.4: + version "0.0.4" + resolved "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" + integrity sha1-XX6kW7755Kb/ZflUOOCofDV9WnM= + dependencies: + indexof "0.0.1" + +void-elements@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" + integrity sha1-wGavtYK7HLQSjWDqkjkulNXp2+w= + +watchpack@^1.5.0: + version "1.6.0" + resolved "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" + integrity sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA== + dependencies: + chokidar "^2.0.2" + graceful-fs "^4.1.2" + neo-async "^2.5.0" + +wbuf@^1.1.0, wbuf@^1.7.2: + version "1.7.3" + resolved "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" + integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== + dependencies: + minimalistic-assert "^1.0.0" + +weak-map@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/weak-map/-/weak-map-1.0.5.tgz#79691584d98607f5070bd3b70a40e6bb22e401eb" + integrity sha1-eWkVhNmGB/UHC9O3CkDmuyLkAes= + +webpack-cli@^3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.1.2.tgz#17d7e01b77f89f884a2bbf9db545f0f6a648e746" + integrity sha512-Cnqo7CeqeSvC6PTdts+dywNi5CRlIPbLx1AoUPK2T6vC1YAugMG3IOoO9DmEscd+Dghw7uRlnzV1KwOe5IrtgQ== + dependencies: + chalk "^2.4.1" + cross-spawn "^6.0.5" + enhanced-resolve "^4.1.0" + global-modules-path "^2.3.0" + import-local "^2.0.0" + interpret "^1.1.0" + loader-utils "^1.1.0" + supports-color "^5.5.0" + v8-compile-cache "^2.0.2" + yargs "^12.0.2" + +webpack-concat-plugin@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/webpack-concat-plugin/-/webpack-concat-plugin-3.0.0.tgz#db34ae230794b634061bc2944053ed407619f138" + integrity sha512-DLdDbZXyrFR99wyAVC9P06HLjr2XujBmQdSbnQMK2o01H9U2NHsN5W76jeTVeXDq5OLvZf8r/se65ftRo3Prow== + dependencies: + concat-with-sourcemaps "^1.0.5" + globby "^8.0.1" + schema-utils "^0.4.5" + uglify-es "^3.3.9" + upath "^1.1.0" + +webpack-dev-middleware@3.4.0: + version "3.4.0" + resolved "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.4.0.tgz#1132fecc9026fd90f0ecedac5cbff75d1fb45890" + integrity sha512-Q9Iyc0X9dP9bAsYskAVJ/hmIZZQwf/3Sy4xCAZgL5cUkjZmUZLt4l5HpbST/Pdgjn3u6pE7u5OdGd1apgzRujA== + dependencies: + memory-fs "~0.4.1" + mime "^2.3.1" + range-parser "^1.0.3" + webpack-log "^2.0.0" + +webpack-dev-middleware@^2.0.6: + version "2.0.6" + resolved "http://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-2.0.6.tgz#a51692801e8310844ef3e3790e1eacfe52326fd4" + integrity sha512-tj5LLD9r4tDuRIDa5Mu9lnY2qBBehAITv6A9irqXhw/HQquZgTx3BCd57zYbU2gMDnncA49ufK2qVQSbaKJwOw== + dependencies: + loud-rejection "^1.6.0" + memory-fs "~0.4.1" + mime "^2.1.0" + path-is-absolute "^1.0.0" + range-parser "^1.0.3" + url-join "^2.0.2" + webpack-log "^1.0.1" + +webpack-dev-server@^3.1.9: + version "3.1.9" + resolved "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.1.9.tgz#8b32167624d2faff40dcedc2cbce17ed1f34d3e0" + integrity sha512-fqPkuNalLuc/hRC2QMkVYJkgNmRvxZQo7ykA2e1XRg/tMJm3qY7ZaD6d89/Fqjxtj9bOrn5wZzLD2n84lJdvWg== + dependencies: + ansi-html "0.0.7" + bonjour "^3.5.0" + chokidar "^2.0.0" + compression "^1.5.2" + connect-history-api-fallback "^1.3.0" + debug "^3.1.0" + del "^3.0.0" + express "^4.16.2" + html-entities "^1.2.0" + http-proxy-middleware "~0.18.0" + import-local "^2.0.0" + internal-ip "^3.0.1" + ip "^1.1.5" + killable "^1.0.0" + loglevel "^1.4.1" + opn "^5.1.0" + portfinder "^1.0.9" + schema-utils "^1.0.0" + selfsigned "^1.9.1" + serve-index "^1.7.2" + sockjs "0.3.19" + sockjs-client "1.1.5" + spdy "^3.4.1" + strip-ansi "^3.0.0" + supports-color "^5.1.0" + webpack-dev-middleware "3.4.0" + webpack-log "^2.0.0" + yargs "12.0.2" + +webpack-log@^1.0.1: + version "1.2.0" + resolved "https://registry.npmjs.org/webpack-log/-/webpack-log-1.2.0.tgz#a4b34cda6b22b518dbb0ab32e567962d5c72a43d" + integrity sha512-U9AnICnu50HXtiqiDxuli5gLB5PGBo7VvcHx36jRZHwK4vzOYLbImqT4lwWwoMHdQWwEKw736fCHEekokTEKHA== + dependencies: + chalk "^2.1.0" + log-symbols "^2.1.0" + loglevelnext "^1.0.1" + uuid "^3.1.0" + +webpack-log@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f" + integrity sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg== + dependencies: + ansi-colors "^3.0.0" + uuid "^3.3.2" + +webpack-merge@^4.1.4: + version "4.1.4" + resolved "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.1.4.tgz#0fde38eabf2d5fd85251c24a5a8c48f8a3f4eb7b" + integrity sha512-TmSe1HZKeOPey3oy1Ov2iS3guIZjWvMT2BBJDzzT5jScHTjVC3mpjJofgueEzaEd6ibhxRDD6MIblDr8tzh8iQ== + dependencies: + lodash "^4.17.5" + +webpack-simple-progress-plugin@^0.0.4: + version "0.0.4" + resolved "https://registry.npmjs.org/webpack-simple-progress-plugin/-/webpack-simple-progress-plugin-0.0.4.tgz#c4829137429cb673dfc6a61a262b955c35cc7ba2" + integrity sha512-uUaaa5ioUJssHVNNiBnmxsVKJUlpPB6wqBfsELW2Xb+ka36UTXX49VPm/Ey1KZxEHQTy27qFE/CY/9c3zeOFng== + dependencies: + chalk "^1.1.3" + object-assign "^4.1.0" + progress "^1.1.8" + +webpack-sources@^1.1.0, webpack-sources@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz#2a28dcb9f1f45fe960d8f1493252b5ee6530fa85" + integrity sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA== + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + +webpack@^4.20.2: + version "4.20.2" + resolved "https://registry.npmjs.org/webpack/-/webpack-4.20.2.tgz#89f6486b6bb276a91b0823453d377501fc625b5a" + integrity sha512-75WFUMblcWYcocjSLlXCb71QuGyH7egdBZu50FtBGl2Nso8CK3Ej+J7bTZz2FPFq5l6fzCisD9modB7t30ikuA== + dependencies: + "@webassemblyjs/ast" "1.7.8" + "@webassemblyjs/helper-module-context" "1.7.8" + "@webassemblyjs/wasm-edit" "1.7.8" + "@webassemblyjs/wasm-parser" "1.7.8" + acorn "^5.6.2" + acorn-dynamic-import "^3.0.0" + ajv "^6.1.0" + ajv-keywords "^3.1.0" + chrome-trace-event "^1.0.0" + enhanced-resolve "^4.1.0" + eslint-scope "^4.0.0" + json-parse-better-errors "^1.0.2" + loader-runner "^2.3.0" + loader-utils "^1.1.0" + memory-fs "~0.4.1" + micromatch "^3.1.8" + mkdirp "~0.5.0" + neo-async "^2.5.0" + node-libs-browser "^2.0.0" + schema-utils "^0.4.4" + tapable "^1.1.0" + uglifyjs-webpack-plugin "^1.2.4" + watchpack "^1.5.0" + webpack-sources "^1.3.0" + +websocket-driver@>=0.5.1: + version "0.7.0" + resolved "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz#0caf9d2d755d93aee049d4bdd0d3fe2cca2a24eb" + integrity sha1-DK+dLXVdk67gSdS90NP+LMoqJOs= + dependencies: + http-parser-js ">=0.4.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.3" + resolved "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29" + integrity sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg== + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + +which@^1.1.1, which@^1.2.1, which@^1.2.10, which@^1.2.8, which@^1.2.9: + version "1.3.1" + resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.0: + version "1.1.3" + resolved "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== + dependencies: + string-width "^1.0.2 || 2" + +widest-line@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/widest-line/-/widest-line-2.0.0.tgz#0142a4e8a243f8882c0233aa0e0281aa76152273" + integrity sha1-AUKk6KJD+IgsAjOqDgKBqnYVInM= + dependencies: + string-width "^2.1.1" + +wordwrap@^1.0.0, wordwrap@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= + +wordwrap@~0.0.2: + version "0.0.3" + resolved "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= + +worker-farm@^1.5.2: + version "1.6.0" + resolved "https://registry.npmjs.org/worker-farm/-/worker-farm-1.6.0.tgz#aecc405976fab5a95526180846f0dba288f3a4a0" + integrity sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ== + dependencies: + errno "~0.1.7" + +wrap-ansi@^2.0.0: + version "2.1.0" + resolved "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + +wrappy@1: + version "1.0.2" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +write-file-atomic@^2.0.0: + version "2.3.0" + resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab" + integrity sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA== + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" + +ws@~3.3.1: + version "3.3.3" + resolved "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2" + integrity sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA== + dependencies: + async-limiter "~1.0.0" + safe-buffer "~5.1.0" + ultron "~1.1.0" + +xdg-basedir@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" + integrity sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ= + +xmlhttprequest-ssl@~1.5.4: + version "1.5.5" + resolved "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz#c2876b06168aadc40e57d97e81191ac8f4398b3e" + integrity sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4= + +xregexp@4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/xregexp/-/xregexp-4.0.0.tgz#e698189de49dd2a18cc5687b05e17c8e43943020" + integrity sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg== + +"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@~4.0.0, xtend@~4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" + integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= + +xtend@^2.1.2: + version "2.2.0" + resolved "https://registry.npmjs.org/xtend/-/xtend-2.2.0.tgz#eef6b1f198c1c8deafad8b1765a04dad4a01c5a9" + integrity sha1-7vax8ZjByN6vrYsXZaBNrUoBxak= + +"y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" + integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== + +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= + +yallist@^3.0.0, yallist@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9" + integrity sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k= + +yargs-parser@^10.1.0: + version "10.1.0" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" + integrity sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ== + dependencies: + camelcase "^4.1.0" + +yargs@12.0.2, yargs@^12.0.2: + version "12.0.2" + resolved "https://registry.npmjs.org/yargs/-/yargs-12.0.2.tgz#fe58234369392af33ecbef53819171eff0f5aadc" + integrity sha512-e7SkEx6N6SIZ5c5H22RTZae61qtn3PYUE8JYbBFlK9sYmh3DMQ6E5ygtaG/2BW0JZi4WGgTR2IV5ChqlqrDGVQ== + dependencies: + cliui "^4.0.0" + decamelize "^2.0.0" + find-up "^3.0.0" + get-caller-file "^1.0.1" + os-locale "^3.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1 || ^4.0.0" + yargs-parser "^10.1.0" + +yauzl@2.4.1: + version "2.4.1" + resolved "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz#9528f442dab1b2284e58b4379bb194e22e0c4005" + integrity sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU= + dependencies: + fd-slicer "~1.0.1" + +yeast@0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" + integrity sha1-AI4G2AlDIMNy28L47XagymyKxBk= + +yn@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz#e5adabc8acf408f6385fc76495684c88e6af689a" + integrity sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=