commit c895877b7e7319a572b3784fb0159d9b5544fad8 Author: Dillon-Brown Date: Tue Mar 30 19:12:01 2021 +0100 SuiteCRM 8 initial commit diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md new file mode 100644 index 000000000..e913c2a3a --- /dev/null +++ b/.github/CONTRIBUTING.md @@ -0,0 +1,183 @@ +## How to contribute to SuiteCRM + + +### **Code of Conduct** + +This project and all community members are expected to uphold the [SuiteCRM Code of Conduct.](https://github.com/salesagility/SuiteCRM/blob/master/CODE_OF_CONDUCT.md) + +#### **Bug Reporting** + +* **Please do not open a GitHub issue if the bug is a security vulnerability**, and instead email us at security@suitecrm.com. This will be delivered to the product team who handle security issues. Please don't disclose security bugs publicly until they have been handled by the security team. + +* Your email will be acknowledged within 24 hours during the business week (Mon - Fri), and you’ll receive a more detailed response to your email within 72 hours during the business week (Mon - Fri) indicating the next steps in handling your report. + +* **Ensure the bug was not already reported** by searching on GitHub under [Issues.](https://github.com/salesagility/SuiteCRM/issues) + +* If you're unable to find an open issue that relates to your problem, [open a new one.](https://github.com/salesagility/SuiteCRM/issues/new) Please be sure to follow the issue template as much as possible. + +* **Ensure that the bug you are reporting is a core SuiteCRM issue** and not specific to your individual setup. For these types of issues please use the [Community Forum.](https://www.suitecrm.com/forum/suite-forum) + +#### **Did you fix a bug?** + +* To provide a code contribution for an issue you will need to set up your own fork of the SuiteCRM repository, make your code changes, commit the changes and make a Pull Request to the appropriate branch on the SuiteCM repository. See our [Quick Guide to Fork SuiteCRM.](https://suitecrm.com/wiki/index.php/Contributing_to_SuiteCRM#Quick_Guide_to_Fork_SuiteCRM) Once you have set up your forked repository you can begin making commits to the project. + +* Determine which base branch your bug fix should use. If your bug is present in both hotfix and hotfix-7.10.x then you will need to make a seperate pull request for each branch. + +* Separate each fix into a new branch in your repository and name it with the issue ID e.g. bugfix_3062 or issue-1234. + +* When committing to your individual bugfix branch, please try and use the following as your commit message +```Fixed #1234 - ```. E.g. ```Fixed #1436 - Reports with nested Parentheses are removing parameters```. By using this format we can easily include all bug fixes within major and minor release notes on our [Wiki](https://suitecrm.com/wiki/index.php/Main_Page). + +* If you are new to Writing Commit Messages in git, follow the guide [here.](http://chris.beams.io/posts/git-commit/#seven-rules) + +* After you have made your commits and pushed them up to your forked repository you then create a [Pull Request](https://help.github.com/articles/about-pull-requests/) to be reviewed and merged into the SuiteCRM repository. Make a new Pull Request for each issue you fix – do not combine multiple bugfixes into one Pull Request. + Ensure that your Pull Request fork is salesagility/SuiteCRM, base branch is either hotfix or hotfix-7.8.x, the head fork is your repository, and the base branch is your unique bugfix branch e.g. bugfix_1234. + We will automatically reject any Pull Requests made to the wrong branch! + +* If you have not signed our CLA [Contributor License Agreement](https://www.clahub.com/agreements/salesagility/SuiteCRM) then your pull request will fail a check and we will be unable to merge it into the project. You will only be required to sign this once. + +* When a new Pull Request is opened, Travis CI will test the merging of the origin and upstream branch and update the Pull Request. If this check fails you can review the test results and resolve accordingly. To test prior to making a Pull Request install PHPUnit via composer into your develop environment then cd into the tests directory and run: ```$ sh runtests.sh``` + +* Ensure that you follow the pull request [template](https://github.com/salesagility/SuiteCRM/blob/master/.github/PULL_REQUEST_TEMPLATE.md) as much as possible. + +#### **Did you create a new feature or enhancement?** + +* Changes that can be considered a new feature or enhancement should be made to the develop branch instead of the hotfix or hotfix-7.8.x. branch. + +* To contribute a feature to SuiteCRM, similar to providing a Bug Fix, you must create a forked repository of SuiteCRM and set up your git and development environment. + Once done, create a new branch from **hotfix-7.10.x** (Issues effecting 7.10 & 7.11) or **hotfix** (Issues effecting 7.11 only) and name it relevant to the feature's purpose e.g campaign-wizard-ui. Following our [Code Standards,](https://suitecrm.com/wiki/index.php/Coding_Standards) develop the new feature and ensure your forked repository is kept up to date with minor/major releases. See our [Quick Guide to Fork SuiteCRM](https://suitecrm.com/wiki/index.php/Contributing_to_SuiteCRM#Quick_Guide_to_Fork_SuiteCRM) to update your repository. + Make sure your commit messages are relevant and descriptive. When ready to submit for review, make a Pull Request detailing your feature's functionality. + Ensure that your Pull Requests base fork is **salesagility/SuiteCRM**, the base branch is **hotfix-7.10.x** (Issues effecting 7.10 & 7.11) or **hotfix** (Issues effecting 7.11 only), the head fork is your repository, and the base branch is your feature branch. + Add any new PHPUnit tests to the new feature branch if required e.g new modules or classes. + +### Issue and Pull Request Labels + +* This section lists the labels we use to help us track and manage issues and pull requests across the SuiteCRM repositories. + +* By using [GitHub search](https://help.github.com/articles/searching-issues/) you can use labels to help find issues and pull requests that you are interested in. If for example, you are interested in which PR's will be included in the next release of SuiteCRM, you can use the [open issues "Resolved: Next Release"](https://github.com/salesagility/SuiteCRM/issues?q=is%3Aopen+is%3Aissue+label%3A%22Resolved%3A+Next+Release%22) label. + +* We encourage users whom feel an issue should be raised as a higher priority for a next release that they should make a comment to that affect. This also applies to incorrect labelling. + +#### General Labels + +| Label name | `salesagility/SuiteCRM` | Description | +| --- | --- | --- | +| `Bug` | [search][search-suitecrm-label-Bug] | Bugs within the core SuiteCRM codebase | +| `Community Contribution` | [search][search-suitecrm-label-Community-Contribution] | These are contribution made by the community | +| `Deprecated` | [search][search-suitecrm-label-Deprecated] | Issues & PRs related to an unsupported version of SuiteCRM | +| `Enhancement` | [search][search-suitecrm-label-Enhancement] | Pull requests that provide more functionality. Associated Issues are called suggestions | +| `Fix Proposed` | [search][search-suitecrm-label-Fix-Proposed] | A issue that has a PR related to it that provides a possible resolution | +| `Good First Issue` | [search][search-suitecrm-label-Good-First-Issue] | A good issue for someone new to SuiteCRM or web development | +| `Help Wanted` | [search][search-suitecrm-label-Help-Wanted] | Requesting help from the community to achieve a solution | +| `High Priority` | [search][search-suitecrm-label-High-Priority] | Issues & PRs that are critical; broken core functionality; fatal errors; there are no workarounds | +| `Medium Priority` | [search][search-suitecrm-label-Medium-Priority] | Issues & PRs that are important; broken functions; errors; there are workarounds | +| `Low Priority` | [search][search-suitecrm-label-Low-Priority] | Issues & PRs that are minor; broken styling; warns; there are practical workarounds | +| `Resolved: Next Release` | [search][search-suitecrm-label-Resolved-Next-Release] | Issues that have been resolved in a hotfix branch and scheduled to be in the next release | +| `Suggestion` | [search][search-suitecrm-label-Suggestion] | Issue containing a suggestion of functionality, process or UI. Associated PRs are called enhancement | +| `Question` | [search][search-suitecrm-label-Question] | This is a question raised about the functionality of SuiteCRM | + +#### Description Labels + +| Label name | `salesagility/SuiteCRM` | Description | +| --- | --- | --- | +| `API` | [search][search-suitecrm-label-API] | Issues & PRs related to all things regarding the API | +| `Campaigns` | [search][search-suitecrm-label-Campaigns] | Issues & PRs related to all things regarding campaigns | +| `Cases` | [search][search-suitecrm-label-Cases] | Issues & PRs related to all things regarding cases | +| `Clean Up` | [search][search-suitecrm-label-Clean-Up] | Issues & PRs related to all things regarding to technical debt and log files | +| `Databases` | [search][search-suitecrm-label-Databases] | Issues & PRs related to all things regarding databases | +| `Dependencies` | [search][search-suitecrm-label-Dependencies] | Pull Requests that update a core dependency | +| `Developer Tools` | [search][search-suitecrm-label-Developer-Tools] | Issues & PRs related to all things regarding development tools like Robo, Travis, etc | +| `Discussion` | [search][search-suitecrm-label-Discussion] | Issues & PRs related to ongoing discussions | +| `Elasticsearch` | [search][search-suitecrm-label-Elasticsearch] | Issues & PRs related to all things regarding Elasticsearch | +| `Emails:Campaigns` | [search][search-suitecrm-label-Emails:Campaigns] | Issues & PRs related to email campaigns | +| `Emails:Cases` | [search][search-suitecrm-label-Emails:Cases] | Issues & PRs related to email cases & AOP | +| `Emails:Compose` | [search][search-suitecrm-label-Emails:Compose] | Issues & PRs related to email compose | +| `Emails:Config` | [search][search-suitecrm-label-Emails:Config] | Issues & PRs related to email configuration | +| `Emails:Templates` | [search][search-suitecrm-label-Emails:Templates] | Issues & PRs related to email templates | +| `Emails` | [search][search-suitecrm-label-Emails] | Issues & PRs related to all things regarding emails & email module | +| `Enviroment` | [search][search-suitecrm-label-Enviroment] | Issues & PRs related to the application environment | +| `Installation` | [search][search-suitecrm-label-Installation] | Issues & PRs related to the installation of the application | +| `Language` | [search][search-suitecrm-label-Language] | Issues & PRs that are confirmed as issues with language & translation within the core | +| `Module` | [search][search-suitecrm-label-Module] | Issues & PRs related to modules that do not have specific label | +| `Reports` | [search][search-suitecrm-label-Reports] | Issues & PRs related to all things regarding reports | +| `Upgrading` | [search][search-suitecrm-label-Upgrading] | Issues & PRs related to all things regarding upgrading & UpgradeWizard | +| `Workflow` | [search][search-suitecrm-label-Workflow] | Issues & PRs related to all things regarding workflow | +| `Studio` | [search][search-suitecrm-label-Studio] | Issues & PRs related to all things regarding studio & module builder | +| `Styling` | [search][search-suitecrm-label-Styling] | Issues & PRs related to all things regarding styling | + +#### Status Labels + +| Label name | `salesagility/SuiteCRM` | Description | +| --- | --- | --- | +| `Assessed` | [search][search-suitecrm-label-Assessed] | PRs that have been tested and confirmed to resolve an issue by a core team member | +| `Community Assessed` | [search][search-suitecrm-label-Community-Assessed] | PRs that have been tested and confirmed to resolve an issue by at least 2 community members | +| `In Review` | [search][search-suitecrm-label-In-Review] | Pull Requests that are activity being reviewed by the core team | +| `Wrong Branch` | [search][search-suitecrm-label-Wrong-Branch] | Pull requests that point towards a restricted branch such as master | +| `Needs Review` | [search][search-suitecrm-label-Needs-Review] | Needs the core team to code review | +| `Needs Assessed` | [search][search-suitecrm-label-Needs-Assessed] | Needs the core team to assess | +| `Invalid` | [search][search-suitecrm-label-Invalid] | Issues & PRs which are a duplicate of an existing issue/PR | +| `Duplicate` | [search][search-suitecrm-label-Duplicate] | Issues & PRs which are a duplicate of an existing issue/PR | +| `Requires Tests` | [search][search-suitecrm-label-Requires-Tests] | Suggestion to OP to provide automated testing (unit, or acceptance) | +| `Requires Updates` | [search][search-suitecrm-label-Requires-Updates] | Issues & PRs which requires input or update from the author | +| `Needs Documentation` | [search][search-suitecrm-label-Needs-Documentation] | Requires adding documentation | +| `Needs Duplicated: Latest` | [search][search-suitecrm-label-Needs-Duplicated-Latest] | Pull Requests that require being duplicated to the "latest" branches i.e. Hotfix | +| `Needs Duplicated: LTS` | [search][search-suitecrm-label-Needs-Duplicated-LTS] | Pull Requests that require being duplicated to the LTS branches i.e. hotfix-7.x.x | +| `Work In Progress` | [search][search-suitecrm-label-Work-In-Progress] | Pull Requests that are not yet ready to be assessed | + +[search-suitecrm-label-Bug]: https://github.com/salesagility/SuiteCRM/labels/Bug +[search-suitecrm-label-Community-Contribution]: https://github.com/salesagility/SuiteCRM/labels/Community%20Contribution +[search-suitecrm-label-Deprecated]: https://github.com/salesagility/SuiteCRM/labels/Deprecated +[search-suitecrm-label-Enhancement]: https://github.com/salesagility/SuiteCRM/labels/Enhancement +[search-suitecrm-label-Fix-Proposed]: https://github.com/salesagility/SuiteCRM/labels/Fix%20Proposed +[search-suitecrm-label-Good-First-Issue]: https://github.com/salesagility/SuiteCRM/labels/Good%20First%20Issue +[search-suitecrm-label-Help-Wanted]: https://github.com/salesagility/SuiteCRM/labels/Help%20Wanted +[search-suitecrm-label-High-Priority]: https://github.com/salesagility/SuiteCRM/labels/High%20Priority +[search-suitecrm-label-Medium-Priority]: https://github.com/salesagility/SuiteCRM/labels/Medium%20Priority +[search-suitecrm-label-Low-Priority]: https://github.com/salesagility/SuiteCRM/labels/Low%20Priority +[search-suitecrm-label-Resolved-Next-Release]: https://github.com/salesagility/SuiteCRM/labels/Resolved%3A%20Next%20Release +[search-suitecrm-label-Suggestion]: https://github.com/salesagility/SuiteCRM/labels/Suggestion +[search-suitecrm-label-Question]: https://github.com/salesagility/SuiteCRM/labels/Question + +[search-suitecrm-label-API]: https://github.com/salesagility/SuiteCRM/labels/API +[search-suitecrm-label-Campaigns]: https://github.com/salesagility/SuiteCRM/labels/Campaigns +[search-suitecrm-label-Cases]: https://github.com/salesagility/SuiteCRM/labels/Cases +[search-suitecrm-label-Clean-Up]: https://github.com/salesagility/SuiteCRM/labels/Clean%20Up +[search-suitecrm-label-Databases]: https://github.com/salesagility/SuiteCRM/labels/Databases +[search-suitecrm-label-Dependencies]: https://github.com/salesagility/SuiteCRM/labels/Dependencies +[search-suitecrm-label-Developer-Tools]: https://github.com/salesagility/SuiteCRM/labels/Developer%20Tools +[search-suitecrm-label-Discussion]: https://github.com/salesagility/SuiteCRM/labels/Discussion +[search-suitecrm-label-Elasticsearch]: https://github.com/salesagility/SuiteCRM/labels/Elasticsearch +[search-suitecrm-label-Emails:Campaigns]: https://github.com/salesagility/SuiteCRM/labels/Emails%3ACampaigns +[search-suitecrm-label-Emails:Cases]: https://github.com/salesagility/SuiteCRM/labels/Emails%3ACases +[search-suitecrm-label-Emails:Compose]: https://github.com/salesagility/SuiteCRM/labels/Emails%3ACompose +[search-suitecrm-label-Emails:Config]: https://github.com/salesagility/SuiteCRM/labels/Emails%3AConfig +[search-suitecrm-label-Emails:Templates]: https://github.com/salesagility/SuiteCRM/labels/Emails%3ATemplates +[search-suitecrm-label-Emails]: https://github.com/salesagility/SuiteCRM/labels/Emails +[search-suitecrm-label-Enviroment]: https://github.com/salesagility/SuiteCRM/labels/Environment +[search-suitecrm-label-Installation]: https://github.com/salesagility/SuiteCRM/labels/Installation +[search-suitecrm-label-Language]: https://github.com/salesagility/SuiteCRM/labels/Language +[search-suitecrm-label-Module]: https://github.com/salesagility/SuiteCRM/labels/Module +[search-suitecrm-label-Reports]: https://github.com/salesagility/SuiteCRM/labels/Reports +[search-suitecrm-label-Studio]: https://github.com/salesagility/SuiteCRM/labels/Studio +[search-suitecrm-label-Styling]: https://github.com/salesagility/SuiteCRM/labels/Styling +[search-suitecrm-label-Upgrading]: https://github.com/salesagility/SuiteCRM/labels/Upgrading +[search-suitecrm-label-Workflow]: https://github.com/salesagility/SuiteCRM/labels/Workflow + +[search-suitecrm-label-Duplicate]: https://github.com/salesagility/SuiteCRM/labels/Duplicate +[search-suitecrm-label-Assessed]: https://github.com/salesagility/SuiteCRM/labels/Assessed +[search-suitecrm-label-Community-Assessed]: https://github.com/salesagility/SuiteCRM/labels/Community%20Assessed +[search-suitecrm-label-In-Review]: https://github.com/salesagility/SuiteCRM/labels/In%20Review +[search-suitecrm-label-Invalid]: https://github.com/salesagility/SuiteCRM/labels/Invalid +[search-suitecrm-label-Needs-Assessed]: https://github.com/salesagility/SuiteCRM/labels/Needs%20Assessed +[search-suitecrm-label-Needs-Documentation]: https://github.com/salesagility/SuiteCRM/labels/Needs%20Documentation +[search-suitecrm-label-Needs-Duplicated-Latest]: https://github.com/salesagility/SuiteCRM/labels/Needs%20Duplicated%3A%20Latest +[search-suitecrm-label-Needs-Duplicated-LTS]: https://github.com/salesagility/SuiteCRM/labels/Needs%20Duplicated%3A%20LTS +[search-suitecrm-label-Needs-Review]: https://github.com/salesagility/SuiteCRM/labels/Needs%20Review +[search-suitecrm-label-Requires-Tests]: https://github.com/salesagility/SuiteCRM/labels/Requires%20Tests +[search-suitecrm-label-Requires-Updates]: https://github.com/salesagility/SuiteCRM/labels/Requires%20Updates +[search-suitecrm-label-Work-In-Progress]: https://github.com/salesagility/SuiteCRM/labels/Work%20In%20Progress +[search-suitecrm-label-Wrong-Branch]: https://github.com/salesagility/SuiteCRM/labels/Wrong%20Branch + +Thanks! + +SuiteCRM Team diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 000000000..accac62b5 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,12 @@ +# These are supported funding model platforms + +github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] +patreon: # Replace with a single Patreon username +open_collective: suitecrm +ko_fi: # Replace with a single Ko-fi username +tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel +community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry +liberapay: # Replace with a single Liberapay username +issuehunt: # Replace with a single IssueHunt username +otechie: # Replace with a single Otechie username +custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md new file mode 100644 index 000000000..25c2f11c6 --- /dev/null +++ b/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,37 @@ + + + + +#### Issue + + + +#### Expected Behavior + + +#### Actual Behavior + + + +#### Possible Fix + + +#### Steps to Reproduce + + +1. +2. +3. +4. + +#### Context + + + +#### Your Environment + +* SuiteCRM Version used: +* Browser name and version (e.g. Chrome Version 51.0.2704.63 (64-bit)): +* Environment name and version (e.g. MySQL, PHP 7): +* Operating System and version (e.g Ubuntu 16.04): + diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 000000000..1895389e2 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,30 @@ + + +## Description + + + + + +## Motivation and Context + + +## How To Test This + + +## Types of changes + +- [ ] 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) + +### Final checklist + + +- [ ] My code follows the code style of this project found [here](https://docs.suitecrm.com/community/contributing-code/coding-standards/). +- [ ] My change requires a change to the documentation. +- [ ] I have read the [**How to Contribute**](https://docs.suitecrm.com/community/contributing-code/) guidelines. + + + + \ No newline at end of file diff --git a/.github/SECURITY.md b/.github/SECURITY.md new file mode 100644 index 000000000..9d151e57a --- /dev/null +++ b/.github/SECURITY.md @@ -0,0 +1,21 @@ +# Security Policy + +## Supported Versions + +For a complete compatibility matrix, please see the documentation [here](https://docs.suitecrm.com/admin/compatibility-matrix/). + +| Version | Supported | +| ------- | ------------------ | +| 7.11.x | :heavy_check_mark: | +| 7.10.x | :heavy_check_mark: | +| ≤7.8.x | :x: | + +## Reporting a Vulnerability + +We take Security seriously here at SuiteCRM so if you have discovered a security risk report it by +emailing [security@suitecrm.com](mailto:security@suitecrm.com). This will be delivered to the product team who handle security issues. +Please don't disclose security bugs publicly until they have been handled by the security team. + +Your email will be acknowledged within 24 hours during the business week (Mon - Fri), and you’ll receive a more +detailed response to your email within 72 hours during the business week (Mon - Fri) indicating the next steps in +handling your report. diff --git a/.github/config.yml b/.github/config.yml new file mode 100644 index 000000000..f81222362 --- /dev/null +++ b/.github/config.yml @@ -0,0 +1,94 @@ +owner: + - salesagility + +repo: + - SuiteCRM + +members: + - cameronblaikie + - CamoMacdonald + - code-ph0y + - craigpanton + - Dillon-Brown + - e-reeley + - g-fantini + - gregsoper + - gymad + - jack7anderson7 + - JackBuchanan + - Jason-Dang + - JimMackin + - johnM2401 + - Mac-Rae + - mattlorimer + - MikeyJC + - murdal + - PedroErnst + - pgorod + - samus-aran + - SuiteBot + - willrennie + +eolBranches: + - 7.9.x, + - 7.8.x, + - hotfix-7.8.x + +invalidBranches: + - master + - 7.10.x + +invalid: > + Hello and thanks for the contribution! would you be able to rebase this pull request to the hotfix-7.10.x branch? + we currently don't accept pull requests directly to this branch + (See [SuiteDocs](https://docs.suitecrm.com/community/contributing-code/bugs) for more information). +eol: > + Hello and thanks for the contribution! unfortunately this branch is EOL + (See our [blog post](https://suitecrm.com/7-8-x-end-of-life/) for more information). +invalidIssueTemplate: > + Hello and thanks for raising this issue! I notice you don't seem to be following the standard issue template. If this is a bug report, would you be able to go back and edit this issue while following the template and including exact replication steps? + + + Thanks. +sprintPlanning: > + Hello Everyone! :wave: + + + We are 1 week away from commencing our Sprint. So we would like to take this opportunity to ask for your nominated issues here in this thread so we can assess, refine and coordinate with ourselves (the Core Team) and the community contributors on the upcoming priorities. + + + If you are new to this sprint planning then essentially we are asking you, as the users, to post your issues (by referencing the GitHub hash/ID) that you would like to see being tackled. We, the Core Team, will review and select the achievable ones within the sprint and allocate them among ourselves. The others we may label them as Help Wanted which would make them up for grabs by our community code contributors. This process will help encourage ownership of these bugs and their bug fixes. [Find out more of the sprint concept here](https://docs.suitecrm.com/community/nominating-issues-in-sprint-planning) :point_left: + + + Sprints are every 2 weeks with the aim to deliver a release every 2 Sprints (monthly). + + + Just to re-iterate from previous posts, that the core team do have other tasks that may not be identified in the above sprints and these are usually from our own internal backlog i.e. improving the release process, CI/CD tools, security patches etc so that accounts for some ‘slack’ visible in the public sprints. + + + Look forward to your nominations! :writing_hand: +sprintRetrospective: > + Hello Everyone! + + + Welcome to the sprint retrospective, lets break down the previous sprint. + + + To Do | In Progress | In Review | Done + + ------------ | ------------- | ------------- | ------------- + + SPRINTMETRICS + + + Again, to note, that we also tackle a lot of other issues that are high priorities, security patches and internal roadmap tasks + + + List of the currently open "Help Wanted" issues: + + HELPWANTED + + + + Thanks everyone and comment below to start a discussion to improve the open sprint processes & gain feedback +1 + We are planning to open the next Sprint for nominations next week. diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..af9cf0ee3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,141 @@ +## SuiteCRM 8 ## + +build/ +config/ +!config/.gitkeep +cache/ +extentions/ +!extentions/.gitkeep +logs/ +!logs/.gitkeep +public/ + +# Theme +.sass-cache +*.css.map +*.min.css + +# Tests +core/tests/coverage + +# Composer +vendor/ +composer.phar + + +# Profiling files +chrome-profiler-events.json +speed-measure-plugin.json + +# Compiled output +dist +tmp +out-tsc + +# Only exists if Bazel was run +bazel-out + +# e2e test files +e2e/*.js +e2e/*.map + +## Generic ## + +# Logs +*.log + +# composer +/vendor/* + +#Ignore bower_components +bower_components/ +node_modules/ + +# htacess +/.htaccess + +## IDE specific items +# Eclipse +*.pydevproject +.project +.buildpath +.metadata +bin/** +tmp/** +tmp/**/* +*.tmp +*.bak +*.swp +*~.nib +local.properties +.classpath +.settings/ +.loadpath +# Emacs +*~ +\#*\# +/.emacs.desktop +/.emacs.desktop.lock +.elc +auto-save-list +tramp +# IntelliJ Idea +*.iml +*.ipr +*.iws +.idea/ +.phpstorm.meta.php +.sass-cache/ +.php_cs.cache +# NetBeans +nbproject/ +#Visual Studio Code +.vscode/ +# Vim +.*.sw[a-z] +*.un~ +*.sln +*.suo +*.phpproj +Session.vim +# Windows +Thumbs.db +Desktop.ini +.DS_Store +.DS_Store? +.save +#browserstack +BrowserStackLocal +browserstack.err + + +# zips and executables +*.7z +*.dmg +*.gz +*.iso +*.jar +*.rar +*.tar +*.zip +*.exe + +# sql +*.sql +*.sql.gz +*.sqlite + +# Ignore testing environment +build/tmp/ + +# Misc +/connect.lock +/coverage +/libpeerconnection.log +npm-debug.log +yarn-error.log +testem.log +/typings + +.c9/ +*.launch diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 000000000..a62339b32 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,35 @@ +# Code of Conduct # + +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. + +Examples of behaviour 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 in a professional manner +* Showing empathy towards other community members + +Examples of unacceptable behaviour 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 + +The SuiteCRM project maintainers are responsible for clarifying the standards of acceptable behaviour and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behaviour. Project maintainers who do not follow or enforce the Code of Conduct may be permanently removed from the project team. + +The SuiteCRM 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 behaviours that they deem inappropriate, threatening, offensive, or harmful. + +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, within project forums, posting via an official social media account, or acting as an appointed representative at an online or offline event. + +Instances of abusive, harassing, or otherwise unacceptable behaviour may be reported by contacting the project team at [community@suitecrm.com][community_email]. All complaints will be reviewed and investigated and will result in a response that is deemed necessary and 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. + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at [http://contributor-covenant.org/version/1/4][version] + +[community_email]: mailto:community@suitecrm.com +[homepage]: http://contributor-covenant.org +[version]: http://contributor-covenant.org/version/1/4/ \ No newline at end of file diff --git a/README.md b/README.md new file mode 100755 index 000000000..c6f82c9d1 --- /dev/null +++ b/README.md @@ -0,0 +1,60 @@ + + + + +# SuiteCRM 8.0-alpha + +[SuiteCRM](https://suitecrm.com) is the award-winning open-source, enterprise-ready Customer Relationship Management (CRM) software application. + +Our vision is to be the most adopted open source enterprise CRM in the world, giving users full control of their data and freedom to own and customise their business solution. + +Try out a free fully working [SuiteCRM demo available here](https://suitecrm.com/demo/) + + +### License [![AGPLv3](https://img.shields.io/github/license/suitecrm/suitecrm.svg)](./LICENSE.txt) + +SuiteCRM is published under the AGPLv3 license. + + +## Quick Start Quide + +### System Requirements + +| Requirement | Version | | Database | Version | +|---|---|---|---|---| +| PHP | 7.2+ || MariaDB |10.2+ | +| Angular | 7+ || MySQL | 5.6-5.7| +| Node.js | 10 || SQL Server | 2012+ | +| Apache | 2.4 | + +### Installation + +1. Run `composer install` in the root directory +2. Run `composer install` in legacy directory +3. Compile legacy theme +3. Run legacy install process +4. Create config.yml with config directory with the following strucure +``` +server: + environment: 'develop' +storage: + mysql: + driver: 'pdo_mysql' + host: '{db_host}' + dbname: '{db_name}' + user: '{db_user}' + password: '{db_pass}' + io: 'both' +entity: + namespaces: + core/modules/Users/Config/orm: 'SuiteCRM\Core\Modules\Users\Entity' +``` +5. Set permissions +``` +chown -R {user ID}:{web user group} . +find . -type d -exec chmod 0755 {} \; +find . -type f -exec chmod 0644 {} \; +chmod +x bin/cli +``` +6. Run `bin/cli orm:schema-tool:update --force` +7. Run `bin/cli app:rebuild` \ No newline at end of file diff --git a/composer.json b/composer.json new file mode 100755 index 000000000..593ea050a --- /dev/null +++ b/composer.json @@ -0,0 +1,52 @@ +{ + "name": "salesagility/suitecrm", + "description": "SuiteCRM Application", + "homepage": "https://suitecrm.com", + "type": "project", + "config": { + "vendor-dir": "vendor", + "platform": { + "php": "7.2.0" + }, + "optimize-autoloader": true, + "sort-packages": true + }, + "require": { + "ext-json": "*", + "bshaffer/oauth2-server-httpfoundation-bridge": "^1.4", + "bshaffer/oauth2-server-php": "^1.11.1", + "composer/installers": "~1.0", + "doctrine/cache": "^1.8", + "doctrine/dbal": "^2.9", + "doctrine/orm": "2.6.*", + "monolog/monolog": "^1.23", + "symfony/config": "^4.2", + "symfony/console": "^4.3", + "symfony/http-foundation": "^4.2", + "symfony/routing": "4.4.x-dev", + "symfony/yaml": "^4.2" + }, + "require-dev": { + "roave/security-advisories": "dev-master", + "phpunit/phpunit": "^7.3", + "phpmetrics/phpmetrics": "^2.4.1", + "phploc/phploc": "^4.0.1", + "doctrine/doctrine-fixtures-bundle": "~3.2", + "dama/doctrine-test-bundle": "^5.0" + }, + "license": "GPL-3.0", + "authors": [ + { + "name": "SalesAgility Ltd" + } + ], + "autoload": { + "psr-4": { + "SuiteCRM\\Core\\Base\\": "core/base/", + "SuiteCRM\\Core\\Modules\\": "core/modules/", + "SuiteCRM\\Core\\Legacy\\": "core/legacy/" + } + }, + "minimum-stability": "dev", + "prefer-stable": true +} diff --git a/composer.lock b/composer.lock new file mode 100644 index 000000000..3f43d371a --- /dev/null +++ b/composer.lock @@ -0,0 +1,5756 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "1dd262db5abdd532a2ad48b4d72b44c7", + "packages": [ + { + "name": "bshaffer/oauth2-server-httpfoundation-bridge", + "version": "v1.4", + "source": { + "type": "git", + "url": "https://github.com/bshaffer/oauth2-server-httpfoundation-bridge.git", + "reference": "f2479fb24db24932962430deadac0e29ca2729f7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/bshaffer/oauth2-server-httpfoundation-bridge/zipball/f2479fb24db24932962430deadac0e29ca2729f7", + "reference": "f2479fb24db24932962430deadac0e29ca2729f7", + "shasum": "" + }, + "require": { + "bshaffer/oauth2-server-php": ">=0.9", + "php": ">=5.3.0", + "symfony/http-foundation": ">=2.1" + }, + "type": "library", + "autoload": { + "psr-0": { + "OAuth2\\HttpFoundationBridge": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brent Shaffer", + "email": "bshafs@gmail.com", + "homepage": "http://brentertainment.com" + } + ], + "description": "A bridge to HttpFoundation for oauth2-server-php", + "homepage": "http://github.com/bshaffer/oauth2-server-httpfoundation-bridge", + "keywords": [ + "auth", + "httpfoundation", + "oauth", + "oauth2" + ], + "time": "2018-12-04T02:28:38+00:00" + }, + { + "name": "bshaffer/oauth2-server-php", + "version": "v1.11.1", + "source": { + "type": "git", + "url": "https://github.com/bshaffer/oauth2-server-php.git", + "reference": "5a0c8000d4763b276919e2106f54eddda6bc50fa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/bshaffer/oauth2-server-php/zipball/5a0c8000d4763b276919e2106f54eddda6bc50fa", + "reference": "5a0c8000d4763b276919e2106f54eddda6bc50fa", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "require-dev": { + "aws/aws-sdk-php": "~2.8", + "firebase/php-jwt": "~2.2", + "mongodb/mongodb": "^1.1", + "phpunit/phpunit": "^4.0", + "predis/predis": "dev-master", + "thobbs/phpcassa": "dev-master" + }, + "suggest": { + "aws/aws-sdk-php": "~2.8 is required to use DynamoDB storage", + "firebase/php-jwt": "~2.2 is required to use JWT features", + "mongodb/mongodb": "^1.1 is required to use MongoDB storage", + "predis/predis": "Required to use Redis storage", + "thobbs/phpcassa": "Required to use Cassandra storage" + }, + "type": "library", + "autoload": { + "psr-0": { + "OAuth2": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brent Shaffer", + "email": "bshafs@gmail.com", + "homepage": "http://brentertainment.com" + } + ], + "description": "OAuth2 Server for PHP", + "homepage": "http://github.com/bshaffer/oauth2-server-php", + "keywords": [ + "auth", + "oauth", + "oauth2" + ], + "time": "2018-12-04T00:29:32+00:00" + }, + { + "name": "composer/ca-bundle", + "version": "1.2.4", + "source": { + "type": "git", + "url": "https://github.com/composer/ca-bundle.git", + "reference": "10bb96592168a0f8e8f6dcde3532d9fa50b0b527" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/10bb96592168a0f8e8f6dcde3532d9fa50b0b527", + "reference": "10bb96592168a0f8e8f6dcde3532d9fa50b0b527", + "shasum": "" + }, + "require": { + "ext-openssl": "*", + "ext-pcre": "*", + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 8", + "psr/log": "^1.0", + "symfony/process": "^2.5 || ^3.0 || ^4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\CaBundle\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.", + "keywords": [ + "cabundle", + "cacert", + "certificate", + "ssl", + "tls" + ], + "time": "2019-08-30T08:44:50+00:00" + }, + { + "name": "composer/composer", + "version": "1.9.1", + "source": { + "type": "git", + "url": "https://github.com/composer/composer.git", + "reference": "bb01f2180df87ce7992b8331a68904f80439dd2f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/composer/zipball/bb01f2180df87ce7992b8331a68904f80439dd2f", + "reference": "bb01f2180df87ce7992b8331a68904f80439dd2f", + "shasum": "" + }, + "require": { + "composer/ca-bundle": "^1.0", + "composer/semver": "^1.0", + "composer/spdx-licenses": "^1.2", + "composer/xdebug-handler": "^1.1", + "justinrainbow/json-schema": "^3.0 || ^4.0 || ^5.0", + "php": "^5.3.2 || ^7.0", + "psr/log": "^1.0", + "seld/jsonlint": "^1.4", + "seld/phar-utils": "^1.0", + "symfony/console": "^2.7 || ^3.0 || ^4.0", + "symfony/filesystem": "^2.7 || ^3.0 || ^4.0", + "symfony/finder": "^2.7 || ^3.0 || ^4.0", + "symfony/process": "^2.7 || ^3.0 || ^4.0" + }, + "conflict": { + "symfony/console": "2.8.38" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7", + "phpunit/phpunit-mock-objects": "^2.3 || ^3.0" + }, + "suggest": { + "ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages", + "ext-zip": "Enabling the zip extension allows you to unzip archives", + "ext-zlib": "Allow gzip compression of HTTP requests" + }, + "bin": [ + "bin/composer" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.9-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\": "src/Composer" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "Composer helps you declare, manage and install dependencies of PHP projects. It ensures you have the right stack everywhere.", + "homepage": "https://getcomposer.org/", + "keywords": [ + "autoload", + "dependency", + "package" + ], + "time": "2019-11-01T16:20:17+00:00" + }, + { + "name": "composer/installers", + "version": "v1.7.0", + "source": { + "type": "git", + "url": "https://github.com/composer/installers.git", + "reference": "141b272484481432cda342727a427dc1e206bfa0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/installers/zipball/141b272484481432cda342727a427dc1e206bfa0", + "reference": "141b272484481432cda342727a427dc1e206bfa0", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0" + }, + "replace": { + "roundcube/plugin-installer": "*", + "shama/baton": "*" + }, + "require-dev": { + "composer/composer": "1.0.*@dev", + "phpunit/phpunit": "^4.8.36" + }, + "type": "composer-plugin", + "extra": { + "class": "Composer\\Installers\\Plugin", + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Installers\\": "src/Composer/Installers" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kyle Robinson Young", + "email": "kyle@dontkry.com", + "homepage": "https://github.com/shama" + } + ], + "description": "A multi-framework Composer library installer", + "homepage": "https://composer.github.io/installers/", + "keywords": [ + "Craft", + "Dolibarr", + "Eliasis", + "Hurad", + "ImageCMS", + "Kanboard", + "Lan Management System", + "MODX Evo", + "Mautic", + "Maya", + "OXID", + "Plentymarkets", + "Porto", + "RadPHP", + "SMF", + "Thelia", + "Whmcs", + "WolfCMS", + "agl", + "aimeos", + "annotatecms", + "attogram", + "bitrix", + "cakephp", + "chef", + "cockpit", + "codeigniter", + "concrete5", + "croogo", + "dokuwiki", + "drupal", + "eZ Platform", + "elgg", + "expressionengine", + "fuelphp", + "grav", + "installer", + "itop", + "joomla", + "known", + "kohana", + "laravel", + "lavalite", + "lithium", + "magento", + "majima", + "mako", + "mediawiki", + "modulework", + "modx", + "moodle", + "osclass", + "phpbb", + "piwik", + "ppi", + "puppet", + "pxcms", + "reindex", + "roundcube", + "shopware", + "silverstripe", + "sydes", + "symfony", + "typo3", + "wordpress", + "yawik", + "zend", + "zikula" + ], + "time": "2019-08-12T15:00:31+00:00" + }, + { + "name": "composer/semver", + "version": "1.5.0", + "source": { + "type": "git", + "url": "https://github.com/composer/semver.git", + "reference": "46d9139568ccb8d9e7cdd4539cab7347568a5e2e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/semver/zipball/46d9139568ccb8d9e7cdd4539cab7347568a5e2e", + "reference": "46d9139568ccb8d9e7cdd4539cab7347568a5e2e", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.5 || ^5.0.5", + "phpunit/phpunit-mock-objects": "2.3.0 || ^3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Semver\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + }, + { + "name": "Rob Bast", + "email": "rob.bast@gmail.com", + "homepage": "http://robbast.nl" + } + ], + "description": "Semver library that offers utilities, version constraint parsing and validation.", + "keywords": [ + "semantic", + "semver", + "validation", + "versioning" + ], + "time": "2019-03-19T17:25:45+00:00" + }, + { + "name": "composer/spdx-licenses", + "version": "1.5.2", + "source": { + "type": "git", + "url": "https://github.com/composer/spdx-licenses.git", + "reference": "7ac1e6aec371357df067f8a688c3d6974df68fa5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/7ac1e6aec371357df067f8a688c3d6974df68fa5", + "reference": "7ac1e6aec371357df067f8a688c3d6974df68fa5", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Spdx\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + }, + { + "name": "Rob Bast", + "email": "rob.bast@gmail.com", + "homepage": "http://robbast.nl" + } + ], + "description": "SPDX licenses list and validation library.", + "keywords": [ + "license", + "spdx", + "validator" + ], + "time": "2019-07-29T10:31:59+00:00" + }, + { + "name": "composer/xdebug-handler", + "version": "1.4.0", + "source": { + "type": "git", + "url": "https://github.com/composer/xdebug-handler.git", + "reference": "cbe23383749496fe0f373345208b79568e4bc248" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/cbe23383749496fe0f373345208b79568e4bc248", + "reference": "cbe23383749496fe0f373345208b79568e4bc248", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0 || ^8.0", + "psr/log": "^1.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 8" + }, + "type": "library", + "autoload": { + "psr-4": { + "Composer\\XdebugHandler\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "John Stevenson", + "email": "john-stevenson@blueyonder.co.uk" + } + ], + "description": "Restarts a process without Xdebug.", + "keywords": [ + "Xdebug", + "performance" + ], + "time": "2019-11-06T16:40:04+00:00" + }, + { + "name": "doctrine/annotations", + "version": "v1.8.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/annotations.git", + "reference": "904dca4eb10715b92569fbcd79e201d5c349b6bc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/904dca4eb10715b92569fbcd79e201d5c349b6bc", + "reference": "904dca4eb10715b92569fbcd79e201d5c349b6bc", + "shasum": "" + }, + "require": { + "doctrine/lexer": "1.*", + "php": "^7.1" + }, + "require-dev": { + "doctrine/cache": "1.*", + "phpunit/phpunit": "^7.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.7.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Docblock Annotations Parser", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "annotations", + "docblock", + "parser" + ], + "time": "2019-10-01T18:55:10+00:00" + }, + { + "name": "doctrine/cache", + "version": "1.10.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/cache.git", + "reference": "382e7f4db9a12dc6c19431743a2b096041bcdd62" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/cache/zipball/382e7f4db9a12dc6c19431743a2b096041bcdd62", + "reference": "382e7f4db9a12dc6c19431743a2b096041bcdd62", + "shasum": "" + }, + "require": { + "php": "~7.1" + }, + "conflict": { + "doctrine/common": ">2.2,<2.4" + }, + "require-dev": { + "alcaeus/mongo-php-adapter": "^1.1", + "doctrine/coding-standard": "^6.0", + "mongodb/mongodb": "^1.1", + "phpunit/phpunit": "^7.0", + "predis/predis": "~1.0" + }, + "suggest": { + "alcaeus/mongo-php-adapter": "Required to use legacy MongoDB driver" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.9.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Cache library is a popular cache implementation that supports many different drivers such as redis, memcache, apc, mongodb and others.", + "homepage": "https://www.doctrine-project.org/projects/cache.html", + "keywords": [ + "abstraction", + "apcu", + "cache", + "caching", + "couchdb", + "memcached", + "php", + "redis", + "xcache" + ], + "time": "2019-11-29T15:36:20+00:00" + }, + { + "name": "doctrine/collections", + "version": "1.6.4", + "source": { + "type": "git", + "url": "https://github.com/doctrine/collections.git", + "reference": "6b1e4b2b66f6d6e49983cebfe23a21b7ccc5b0d7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/collections/zipball/6b1e4b2b66f6d6e49983cebfe23a21b7ccc5b0d7", + "reference": "6b1e4b2b66f6d6e49983cebfe23a21b7ccc5b0d7", + "shasum": "" + }, + "require": { + "php": "^7.1.3" + }, + "require-dev": { + "doctrine/coding-standard": "^6.0", + "phpstan/phpstan-shim": "^0.9.2", + "phpunit/phpunit": "^7.0", + "vimeo/psalm": "^3.2.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.6.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\Collections\\": "lib/Doctrine/Common/Collections" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Collections library that adds additional functionality on top of PHP arrays.", + "homepage": "https://www.doctrine-project.org/projects/collections.html", + "keywords": [ + "array", + "collections", + "iterators", + "php" + ], + "time": "2019-11-13T13:07:11+00:00" + }, + { + "name": "doctrine/common", + "version": "v2.11.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/common.git", + "reference": "b8ca1dcf6b0dc8a2af7a09baac8d0c48345df4ff" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/common/zipball/b8ca1dcf6b0dc8a2af7a09baac8d0c48345df4ff", + "reference": "b8ca1dcf6b0dc8a2af7a09baac8d0c48345df4ff", + "shasum": "" + }, + "require": { + "doctrine/annotations": "^1.0", + "doctrine/cache": "^1.0", + "doctrine/collections": "^1.0", + "doctrine/event-manager": "^1.0", + "doctrine/inflector": "^1.0", + "doctrine/lexer": "^1.0", + "doctrine/persistence": "^1.1", + "doctrine/reflection": "^1.0", + "php": "^7.1" + }, + "require-dev": { + "doctrine/coding-standard": "^1.0", + "phpstan/phpstan": "^0.11", + "phpstan/phpstan-phpunit": "^0.11", + "phpunit/phpunit": "^7.0", + "squizlabs/php_codesniffer": "^3.0", + "symfony/phpunit-bridge": "^4.0.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.11.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\": "lib/Doctrine/Common" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "PHP Doctrine Common project is a library that provides additional functionality that other Doctrine projects depend on such as better reflection support, persistence interfaces, proxies, event system and much more.", + "homepage": "https://www.doctrine-project.org/projects/common.html", + "keywords": [ + "common", + "doctrine", + "php" + ], + "time": "2019-09-10T10:10:14+00:00" + }, + { + "name": "doctrine/dbal", + "version": "v2.10.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/dbal.git", + "reference": "0c9a646775ef549eb0a213a4f9bd4381d9b4d934" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/0c9a646775ef549eb0a213a4f9bd4381d9b4d934", + "reference": "0c9a646775ef549eb0a213a4f9bd4381d9b4d934", + "shasum": "" + }, + "require": { + "doctrine/cache": "^1.0", + "doctrine/event-manager": "^1.0", + "ext-pdo": "*", + "php": "^7.2" + }, + "require-dev": { + "doctrine/coding-standard": "^6.0", + "jetbrains/phpstorm-stubs": "^2019.1", + "phpstan/phpstan": "^0.11.3", + "phpunit/phpunit": "^8.4.1", + "symfony/console": "^2.0.5|^3.0|^4.0|^5.0" + }, + "suggest": { + "symfony/console": "For helpful console commands such as SQL execution and import of files." + }, + "bin": [ + "bin/doctrine-dbal" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.10.x-dev", + "dev-develop": "3.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\DBAL\\": "lib/Doctrine/DBAL" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + } + ], + "description": "Powerful PHP database abstraction layer (DBAL) with many features for database schema introspection and management.", + "homepage": "https://www.doctrine-project.org/projects/dbal.html", + "keywords": [ + "abstraction", + "database", + "db2", + "dbal", + "mariadb", + "mssql", + "mysql", + "oci8", + "oracle", + "pdo", + "pgsql", + "postgresql", + "queryobject", + "sasql", + "sql", + "sqlanywhere", + "sqlite", + "sqlserver", + "sqlsrv" + ], + "time": "2019-11-03T16:50:43+00:00" + }, + { + "name": "doctrine/event-manager", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/event-manager.git", + "reference": "629572819973f13486371cb611386eb17851e85c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/event-manager/zipball/629572819973f13486371cb611386eb17851e85c", + "reference": "629572819973f13486371cb611386eb17851e85c", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "conflict": { + "doctrine/common": "<2.9@dev" + }, + "require-dev": { + "doctrine/coding-standard": "^6.0", + "phpunit/phpunit": "^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\": "lib/Doctrine/Common" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "The Doctrine Event Manager is a simple PHP event system that was built to be used with the various Doctrine projects.", + "homepage": "https://www.doctrine-project.org/projects/event-manager.html", + "keywords": [ + "event", + "event dispatcher", + "event manager", + "event system", + "events" + ], + "time": "2019-11-10T09:48:07+00:00" + }, + { + "name": "doctrine/inflector", + "version": "1.3.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "ec3a55242203ffa6a4b27c58176da97ff0a7aec1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/ec3a55242203ffa6a4b27c58176da97ff0a7aec1", + "reference": "ec3a55242203ffa6a4b27c58176da97ff0a7aec1", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "require-dev": { + "phpunit/phpunit": "^6.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\Inflector\\": "lib/Doctrine/Common/Inflector" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Common String Manipulations with regard to casing and singular/plural rules.", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "inflection", + "pluralize", + "singularize", + "string" + ], + "time": "2019-10-30T19:59:35+00:00" + }, + { + "name": "doctrine/instantiator", + "version": "1.3.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/instantiator.git", + "reference": "ae466f726242e637cebdd526a7d991b9433bacf1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/ae466f726242e637cebdd526a7d991b9433bacf1", + "reference": "ae466f726242e637cebdd526a7d991b9433bacf1", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "require-dev": { + "doctrine/coding-standard": "^6.0", + "ext-pdo": "*", + "ext-phar": "*", + "phpbench/phpbench": "^0.13", + "phpstan/phpstan-phpunit": "^0.11", + "phpstan/phpstan-shim": "^0.11", + "phpunit/phpunit": "^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "http://ocramius.github.com/" + } + ], + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "homepage": "https://www.doctrine-project.org/projects/instantiator.html", + "keywords": [ + "constructor", + "instantiate" + ], + "time": "2019-10-21T16:45:58+00:00" + }, + { + "name": "doctrine/lexer", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "5242d66dbeb21a30dd8a3e66bf7a73b66e05e1f6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/5242d66dbeb21a30dd8a3e66bf7a73b66e05e1f6", + "reference": "5242d66dbeb21a30dd8a3e66bf7a73b66e05e1f6", + "shasum": "" + }, + "require": { + "php": "^7.2" + }, + "require-dev": { + "doctrine/coding-standard": "^6.0", + "phpstan/phpstan": "^0.11.8", + "phpunit/phpunit": "^8.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "keywords": [ + "annotations", + "docblock", + "lexer", + "parser", + "php" + ], + "time": "2019-10-30T14:39:59+00:00" + }, + { + "name": "doctrine/orm", + "version": "v2.6.6", + "source": { + "type": "git", + "url": "https://github.com/doctrine/orm.git", + "reference": "2d9b9351831d1230881c52f006011cbf72fe944e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/orm/zipball/2d9b9351831d1230881c52f006011cbf72fe944e", + "reference": "2d9b9351831d1230881c52f006011cbf72fe944e", + "shasum": "" + }, + "require": { + "doctrine/annotations": "~1.5", + "doctrine/cache": "~1.6", + "doctrine/collections": "^1.4", + "doctrine/common": "^2.7.1", + "doctrine/dbal": "^2.6", + "doctrine/instantiator": "~1.1", + "ext-pdo": "*", + "php": "^7.1", + "symfony/console": "~3.0|~4.0" + }, + "require-dev": { + "doctrine/coding-standard": "^5.0", + "phpunit/phpunit": "^7.5", + "symfony/yaml": "~3.4|~4.0" + }, + "suggest": { + "symfony/yaml": "If you want to use YAML Metadata Mapping Driver" + }, + "bin": [ + "bin/doctrine" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.6.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\ORM\\": "lib/Doctrine/ORM" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "Object-Relational-Mapper for PHP", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "database", + "orm" + ], + "time": "2019-11-18T22:01:21+00:00" + }, + { + "name": "doctrine/persistence", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/persistence.git", + "reference": "43526ae63312942e5316100bb3ed589ba1aba491" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/persistence/zipball/43526ae63312942e5316100bb3ed589ba1aba491", + "reference": "43526ae63312942e5316100bb3ed589ba1aba491", + "shasum": "" + }, + "require": { + "doctrine/annotations": "^1.0", + "doctrine/cache": "^1.0", + "doctrine/collections": "^1.0", + "doctrine/event-manager": "^1.0", + "doctrine/reflection": "^1.0", + "php": "^7.1" + }, + "conflict": { + "doctrine/common": "<2.10@dev" + }, + "require-dev": { + "doctrine/coding-standard": "^5.0", + "phpstan/phpstan": "^0.8", + "phpunit/phpunit": "^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\": "lib/Doctrine/Common" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "The Doctrine Persistence project is a set of shared interfaces and functionality that the different Doctrine object mappers share.", + "homepage": "https://doctrine-project.org/projects/persistence.html", + "keywords": [ + "mapper", + "object", + "odm", + "orm", + "persistence" + ], + "time": "2019-04-23T12:39:21+00:00" + }, + { + "name": "doctrine/reflection", + "version": "v1.0.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/reflection.git", + "reference": "02538d3f95e88eb397a5f86274deb2c6175c2ab6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/reflection/zipball/02538d3f95e88eb397a5f86274deb2c6175c2ab6", + "reference": "02538d3f95e88eb397a5f86274deb2c6175c2ab6", + "shasum": "" + }, + "require": { + "doctrine/annotations": "^1.0", + "ext-tokenizer": "*", + "php": "^7.1" + }, + "require-dev": { + "doctrine/coding-standard": "^4.0", + "doctrine/common": "^2.8", + "phpstan/phpstan": "^0.9.2", + "phpstan/phpstan-phpunit": "^0.9.4", + "phpunit/phpunit": "^7.0", + "squizlabs/php_codesniffer": "^3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\": "lib/Doctrine/Common" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "Doctrine Reflection component", + "homepage": "https://www.doctrine-project.org/projects/reflection.html", + "keywords": [ + "reflection" + ], + "time": "2018-06-14T14:45:07+00:00" + }, + { + "name": "justinrainbow/json-schema", + "version": "5.2.9", + "source": { + "type": "git", + "url": "https://github.com/justinrainbow/json-schema.git", + "reference": "44c6787311242a979fa15c704327c20e7221a0e4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/44c6787311242a979fa15c704327c20e7221a0e4", + "reference": "44c6787311242a979fa15c704327c20e7221a0e4", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "~2.2.20||~2.15.1", + "json-schema/json-schema-test-suite": "1.2.0", + "phpunit/phpunit": "^4.8.35" + }, + "bin": [ + "bin/validate-json" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "JsonSchema\\": "src/JsonSchema/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bruno Prieto Reis", + "email": "bruno.p.reis@gmail.com" + }, + { + "name": "Justin Rainbow", + "email": "justin.rainbow@gmail.com" + }, + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" + }, + { + "name": "Robert Schönthal", + "email": "seroscho@googlemail.com" + } + ], + "description": "A library to validate a json schema.", + "homepage": "https://github.com/justinrainbow/json-schema", + "keywords": [ + "json", + "schema" + ], + "time": "2019-09-25T14:49:45+00:00" + }, + { + "name": "monolog/monolog", + "version": "1.25.2", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "d5e2fb341cb44f7e2ab639d12a1e5901091ec287" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/d5e2fb341cb44f7e2ab639d12a1e5901091ec287", + "reference": "d5e2fb341cb44f7e2ab639d12a1e5901091ec287", + "shasum": "" + }, + "require": { + "php": ">=5.3.0", + "psr/log": "~1.0" + }, + "provide": { + "psr/log-implementation": "1.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^2.4.9 || ^3.0", + "doctrine/couchdb": "~1.0@dev", + "graylog2/gelf-php": "~1.0", + "jakub-onderka/php-parallel-lint": "0.9", + "php-amqplib/php-amqplib": "~2.4", + "php-console/php-console": "^3.1.3", + "phpunit/phpunit": "~4.5", + "phpunit/phpunit-mock-objects": "2.3.0", + "ruflin/elastica": ">=0.90 <3.0", + "sentry/sentry": "^0.13", + "swiftmailer/swiftmailer": "^5.3|^6.0" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-mongo": "Allow sending log messages to a MongoDB server", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server via PHP Driver", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "php-console/php-console": "Allow sending log messages to Google Chrome", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server", + "sentry/sentry": "Allow sending log messages to a Sentry server" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "http://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "time": "2019-11-13T10:00:05+00:00" + }, + { + "name": "psr/container", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", + "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "time": "2017-02-14T16:28:37+00:00" + }, + { + "name": "psr/log", + "version": "1.1.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "446d54b4cb6bf489fc9d75f55843658e6f25d801" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/446d54b4cb6bf489fc9d75f55843658e6f25d801", + "reference": "446d54b4cb6bf489fc9d75f55843658e6f25d801", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "Psr/Log/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "time": "2019-11-01T11:05:21+00:00" + }, + { + "name": "seld/jsonlint", + "version": "1.7.2", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/jsonlint.git", + "reference": "e2e5d290e4d2a4f0eb449f510071392e00e10d19" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/e2e5d290e4d2a4f0eb449f510071392e00e10d19", + "reference": "e2e5d290e4d2a4f0eb449f510071392e00e10d19", + "shasum": "" + }, + "require": { + "php": "^5.3 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" + }, + "bin": [ + "bin/jsonlint" + ], + "type": "library", + "autoload": { + "psr-4": { + "Seld\\JsonLint\\": "src/Seld/JsonLint/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "JSON Linter", + "keywords": [ + "json", + "linter", + "parser", + "validator" + ], + "time": "2019-10-24T14:27:39+00:00" + }, + { + "name": "seld/phar-utils", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/phar-utils.git", + "reference": "7009b5139491975ef6486545a39f3e6dad5ac30a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/7009b5139491975ef6486545a39f3e6dad5ac30a", + "reference": "7009b5139491975ef6486545a39f3e6dad5ac30a", + "shasum": "" + }, + "require": { + "php": ">=5.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Seld\\PharUtils\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be" + } + ], + "description": "PHAR file format utilities, for when PHP phars you up", + "keywords": [ + "phra" + ], + "time": "2015-10-13T18:44:15+00:00" + }, + { + "name": "symfony/config", + "version": "v4.4.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/config.git", + "reference": "7aa5817f1b7a8ed377752b90fcc47dfb3c67b40c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/config/zipball/7aa5817f1b7a8ed377752b90fcc47dfb3c67b40c", + "reference": "7aa5817f1b7a8ed377752b90fcc47dfb3c67b40c", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/filesystem": "^3.4|^4.0|^5.0", + "symfony/polyfill-ctype": "~1.8" + }, + "conflict": { + "symfony/finder": "<3.4" + }, + "require-dev": { + "symfony/event-dispatcher": "^3.4|^4.0|^5.0", + "symfony/finder": "^3.4|^4.0|^5.0", + "symfony/messenger": "^4.1|^5.0", + "symfony/service-contracts": "^1.1|^2", + "symfony/yaml": "^3.4|^4.0|^5.0" + }, + "suggest": { + "symfony/yaml": "To use the yaml reference dumper" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Config\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Config Component", + "homepage": "https://symfony.com", + "time": "2019-12-01T10:50:45+00:00" + }, + { + "name": "symfony/console", + "version": "v4.4.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "f0aea3df20d15635b3cb9730ca5eea1c65b7f201" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/f0aea3df20d15635b3cb9730ca5eea1c65b7f201", + "reference": "f0aea3df20d15635b3cb9730ca5eea1c65b7f201", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php73": "^1.8", + "symfony/service-contracts": "^1.1|^2" + }, + "conflict": { + "symfony/dependency-injection": "<3.4", + "symfony/event-dispatcher": "<4.3|>=5", + "symfony/lock": "<4.4", + "symfony/process": "<3.3" + }, + "provide": { + "psr/log-implementation": "1.0" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "^3.4|^4.0|^5.0", + "symfony/dependency-injection": "^3.4|^4.0|^5.0", + "symfony/event-dispatcher": "^4.3", + "symfony/lock": "^4.4|^5.0", + "symfony/process": "^3.4|^4.0|^5.0", + "symfony/var-dumper": "^4.3|^5.0" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/lock": "", + "symfony/process": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Console Component", + "homepage": "https://symfony.com", + "time": "2019-12-01T10:06:17+00:00" + }, + { + "name": "symfony/filesystem", + "version": "v4.4.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "40c2606131d56eff6f193b6e2ceb92414653b591" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/40c2606131d56eff6f193b6e2ceb92414653b591", + "reference": "40c2606131d56eff6f193b6e2ceb92414653b591", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/polyfill-ctype": "~1.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Filesystem\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Filesystem Component", + "homepage": "https://symfony.com", + "time": "2019-11-26T23:16:41+00:00" + }, + { + "name": "symfony/finder", + "version": "v4.4.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "ce8743441da64c41e2a667b8eb66070444ed911e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/ce8743441da64c41e2a667b8eb66070444ed911e", + "reference": "ce8743441da64c41e2a667b8eb66070444ed911e", + "shasum": "" + }, + "require": { + "php": "^7.1.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Finder Component", + "homepage": "https://symfony.com", + "time": "2019-11-17T21:56:56+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v4.4.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "8bccc59e61b41963d14c3dbdb23181e5c932a1d5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/8bccc59e61b41963d14c3dbdb23181e5c932a1d5", + "reference": "8bccc59e61b41963d14c3dbdb23181e5c932a1d5", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/mime": "^4.3|^5.0", + "symfony/polyfill-mbstring": "~1.1" + }, + "require-dev": { + "predis/predis": "~1.0", + "symfony/expression-language": "^3.4|^4.0|^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpFoundation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony HttpFoundation Component", + "homepage": "https://symfony.com", + "time": "2019-11-28T13:33:56+00:00" + }, + { + "name": "symfony/mime", + "version": "v4.4.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/mime.git", + "reference": "010cc488e56cafe5f7494dea70aea93100c234df" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mime/zipball/010cc488e56cafe5f7494dea70aea93100c234df", + "reference": "010cc488e56cafe5f7494dea70aea93100c234df", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0" + }, + "conflict": { + "symfony/mailer": "<4.4" + }, + "require-dev": { + "egulias/email-validator": "^2.1.10", + "symfony/dependency-injection": "^3.4|^4.1|^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Mime\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A library to manipulate MIME messages", + "homepage": "https://symfony.com", + "keywords": [ + "mime", + "mime-type" + ], + "time": "2019-11-30T08:27:26+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.13.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "f8f0b461be3385e56d6de3dbb5a0df24c0c275e3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/f8f0b461be3385e56d6de3dbb5a0df24c0c275e3", + "reference": "f8f0b461be3385e56d6de3dbb5a0df24c0c275e3", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.13-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "time": "2019-11-27T13:56:44+00:00" + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.13.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "6f9c239e61e1b0c9229a28ff89a812dc449c3d46" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/6f9c239e61e1b0c9229a28ff89a812dc449c3d46", + "reference": "6f9c239e61e1b0c9229a28ff89a812dc449c3d46", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "symfony/polyfill-mbstring": "^1.3", + "symfony/polyfill-php72": "^1.9" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.13-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "idn", + "intl", + "polyfill", + "portable", + "shim" + ], + "time": "2019-11-27T13:56:44+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.13.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "7b4aab9743c30be783b73de055d24a39cf4b954f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/7b4aab9743c30be783b73de055d24a39cf4b954f", + "reference": "7b4aab9743c30be783b73de055d24a39cf4b954f", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.13-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "time": "2019-11-27T14:18:11+00:00" + }, + { + "name": "symfony/polyfill-php72", + "version": "v1.13.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php72.git", + "reference": "66fea50f6cb37a35eea048d75a7d99a45b586038" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/66fea50f6cb37a35eea048d75a7d99a45b586038", + "reference": "66fea50f6cb37a35eea048d75a7d99a45b586038", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.13-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php72\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "time": "2019-11-27T13:56:44+00:00" + }, + { + "name": "symfony/polyfill-php73", + "version": "v1.13.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php73.git", + "reference": "4b0e2222c55a25b4541305a053013d5647d3a25f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/4b0e2222c55a25b4541305a053013d5647d3a25f", + "reference": "4b0e2222c55a25b4541305a053013d5647d3a25f", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.13-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php73\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "time": "2019-11-27T16:25:15+00:00" + }, + { + "name": "symfony/process", + "version": "v4.4.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "51c0135ef3f44c5803b33dc60e96bf4f77752726" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/51c0135ef3f44c5803b33dc60e96bf4f77752726", + "reference": "51c0135ef3f44c5803b33dc60e96bf4f77752726", + "shasum": "" + }, + "require": { + "php": "^7.1.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Process Component", + "homepage": "https://symfony.com", + "time": "2019-11-28T13:33:56+00:00" + }, + { + "name": "symfony/routing", + "version": "4.4.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "51f3f20ad29329a0bdf5c0e2f722d3764b065273" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/routing/zipball/51f3f20ad29329a0bdf5c0e2f722d3764b065273", + "reference": "51f3f20ad29329a0bdf5c0e2f722d3764b065273", + "shasum": "" + }, + "require": { + "php": "^7.1.3" + }, + "conflict": { + "symfony/config": "<4.2", + "symfony/dependency-injection": "<3.4", + "symfony/yaml": "<3.4" + }, + "require-dev": { + "doctrine/annotations": "~1.2", + "psr/log": "~1.0", + "symfony/config": "^4.2|^5.0", + "symfony/dependency-injection": "^3.4|^4.0|^5.0", + "symfony/expression-language": "^3.4|^4.0|^5.0", + "symfony/http-foundation": "^3.4|^4.0|^5.0", + "symfony/yaml": "^3.4|^4.0|^5.0" + }, + "suggest": { + "doctrine/annotations": "For using the annotation loader", + "symfony/config": "For using the all-in-one router or any loader", + "symfony/expression-language": "For using expression matching", + "symfony/http-foundation": "For using a Symfony Request object", + "symfony/yaml": "For using the YAML loader" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Routing\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Routing Component", + "homepage": "https://symfony.com", + "keywords": [ + "router", + "routing", + "uri", + "url" + ], + "time": "2019-12-01T08:39:58+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v1.1.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "ffc7f5692092df31515df2a5ecf3b7302b3ddacf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/ffc7f5692092df31515df2a5ecf3b7302b3ddacf", + "reference": "ffc7f5692092df31515df2a5ecf3b7302b3ddacf", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "psr/container": "^1.0" + }, + "suggest": { + "symfony/service-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "time": "2019-10-14T12:27:06+00:00" + }, + { + "name": "symfony/yaml", + "version": "v4.4.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "76de473358fe802578a415d5bb43c296cf09d211" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/76de473358fe802578a415d5bb43c296cf09d211", + "reference": "76de473358fe802578a415d5bb43c296cf09d211", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/polyfill-ctype": "~1.8" + }, + "conflict": { + "symfony/console": "<3.4" + }, + "require-dev": { + "symfony/console": "^3.4|^4.0|^5.0" + }, + "suggest": { + "symfony/console": "For validating YAML files using the lint command" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Yaml Component", + "homepage": "https://symfony.com", + "time": "2019-11-12T14:51:11+00:00" + } + ], + "packages-dev": [ + { + "name": "dama/doctrine-test-bundle", + "version": "v5.0.5", + "source": { + "type": "git", + "url": "https://github.com/dmaicher/doctrine-test-bundle.git", + "reference": "a60b0712f4659eab710c49783713b4b43e3c3149" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dmaicher/doctrine-test-bundle/zipball/a60b0712f4659eab710c49783713b4b43e3c3149", + "reference": "a60b0712f4659eab710c49783713b4b43e3c3149", + "shasum": "" + }, + "require": { + "doctrine/dbal": "^2.9,>=2.9.3", + "doctrine/doctrine-bundle": "~1.4|~2.0", + "php": "^7.1", + "symfony/framework-bundle": "~3.4|~4.0" + }, + "require-dev": { + "phpunit/phpunit": "~7.0|~8.0", + "symfony/phpunit-bridge": "^4.3", + "symfony/yaml": "~2.8|~3.0|~4.0" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "5.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "DAMA\\DoctrineTestBundle\\": "src/DAMA/DoctrineTestBundle" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "David Maicher", + "email": "mail@dmaicher.de" + } + ], + "description": "Symfony bundle to isolate doctrine database tests and improve test performance", + "keywords": [ + "Symfony 3", + "Symfony 4", + "doctrine", + "isolation", + "performance", + "symfony", + "symfony 2", + "tests" + ], + "time": "2019-11-25T10:12:28+00:00" + }, + { + "name": "doctrine/data-fixtures", + "version": "1.4.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/data-fixtures.git", + "reference": "608a35a3b5bcc4214d116603095f8b0c51091592" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/data-fixtures/zipball/608a35a3b5bcc4214d116603095f8b0c51091592", + "reference": "608a35a3b5bcc4214d116603095f8b0c51091592", + "shasum": "" + }, + "require": { + "doctrine/common": "^2.11", + "php": "^7.2" + }, + "conflict": { + "doctrine/phpcr-odm": "<1.3.0" + }, + "require-dev": { + "alcaeus/mongo-php-adapter": "^1.1", + "doctrine/coding-standard": "^6.0", + "doctrine/dbal": "^2.5.4", + "doctrine/mongodb-odm": "^1.3.0", + "doctrine/orm": "^2.5.4", + "phpunit/phpunit": "^7.0" + }, + "suggest": { + "alcaeus/mongo-php-adapter": "For using MongoDB ODM with PHP 7", + "doctrine/mongodb-odm": "For loading MongoDB ODM fixtures", + "doctrine/orm": "For loading ORM fixtures", + "doctrine/phpcr-odm": "For loading PHPCR ODM fixtures" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\DataFixtures\\": "lib/Doctrine/Common/DataFixtures" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + } + ], + "description": "Data Fixtures for all Doctrine Object Managers", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "database" + ], + "time": "2019-10-30T20:03:18+00:00" + }, + { + "name": "doctrine/doctrine-bundle", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/doctrine/DoctrineBundle.git", + "reference": "f96fac225563f5b3b4eeb2f80eb982b7f56484d8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/f96fac225563f5b3b4eeb2f80eb982b7f56484d8", + "reference": "f96fac225563f5b3b4eeb2f80eb982b7f56484d8", + "shasum": "" + }, + "require": { + "doctrine/dbal": "^2.9.0", + "jdorn/sql-formatter": "^1.2.16", + "php": "^7.1", + "symfony/cache": "^4.3.3|^5.0", + "symfony/config": "^4.3.3|^5.0", + "symfony/console": "^3.4.30|^4.3.3|^5.0", + "symfony/dependency-injection": "^4.3.3|^5.0", + "symfony/doctrine-bridge": "^4.3.7|^5.0", + "symfony/framework-bundle": "^3.4.30|^4.3.3|^5.0" + }, + "conflict": { + "doctrine/orm": "<2.6", + "twig/twig": "<1.34|>=2.0,<2.4" + }, + "require-dev": { + "doctrine/coding-standard": "^6.0", + "doctrine/orm": "^2.6", + "phpunit/phpunit": "^7.5", + "symfony/phpunit-bridge": "^4.2", + "symfony/property-info": "^4.3.3|^5.0", + "symfony/twig-bridge": "^3.4.30|^4.3.3|^5.0", + "symfony/validator": "^3.4.30|^4.3.3|^5.0", + "symfony/web-profiler-bundle": "^3.4.30|^4.3.3|^5.0", + "symfony/yaml": "^3.4.30|^4.3.3|^5.0", + "twig/twig": "^1.34|^2.12" + }, + "suggest": { + "doctrine/orm": "The Doctrine ORM integration is optional in the bundle.", + "symfony/web-profiler-bundle": "To use the data collector." + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Bundle\\DoctrineBundle\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + }, + { + "name": "Doctrine Project", + "homepage": "http://www.doctrine-project.org/" + } + ], + "description": "Symfony DoctrineBundle", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "database", + "dbal", + "orm", + "persistence" + ], + "time": "2019-11-28T08:38:10+00:00" + }, + { + "name": "doctrine/doctrine-fixtures-bundle", + "version": "3.3.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/DoctrineFixturesBundle.git", + "reference": "8f07fcfdac7f3591f3c4bf13a50cbae05f65ed70" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/DoctrineFixturesBundle/zipball/8f07fcfdac7f3591f3c4bf13a50cbae05f65ed70", + "reference": "8f07fcfdac7f3591f3c4bf13a50cbae05f65ed70", + "shasum": "" + }, + "require": { + "doctrine/data-fixtures": "^1.3", + "doctrine/doctrine-bundle": "^1.11|^2.0", + "doctrine/orm": "^2.6.0", + "php": "^7.1", + "symfony/config": "^3.4|^4.3|^5.0", + "symfony/console": "^3.4|^4.3|^5.0", + "symfony/dependency-injection": "^3.4|^4.3|^5.0", + "symfony/doctrine-bridge": "^3.4|^4.1|^5.0", + "symfony/http-kernel": "^3.4|^4.3|^5.0" + }, + "require-dev": { + "doctrine/coding-standard": "^6.0", + "phpunit/phpunit": "^7.4", + "symfony/phpunit-bridge": "^4.1|^5.0" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "3.3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Bundle\\FixturesBundle\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Doctrine Project", + "homepage": "http://www.doctrine-project.org" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony DoctrineFixturesBundle", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "Fixture", + "persistence" + ], + "time": "2019-11-13T15:46:58+00:00" + }, + { + "name": "jdorn/sql-formatter", + "version": "v1.2.17", + "source": { + "type": "git", + "url": "https://github.com/jdorn/sql-formatter.git", + "reference": "64990d96e0959dff8e059dfcdc1af130728d92bc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/jdorn/sql-formatter/zipball/64990d96e0959dff8e059dfcdc1af130728d92bc", + "reference": "64990d96e0959dff8e059dfcdc1af130728d92bc", + "shasum": "" + }, + "require": { + "php": ">=5.2.4" + }, + "require-dev": { + "phpunit/phpunit": "3.7.*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3.x-dev" + } + }, + "autoload": { + "classmap": [ + "lib" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jeremy Dorn", + "email": "jeremy@jeremydorn.com", + "homepage": "http://jeremydorn.com/" + } + ], + "description": "a PHP SQL highlighting library", + "homepage": "https://github.com/jdorn/sql-formatter/", + "keywords": [ + "highlight", + "sql" + ], + "time": "2014-01-12T16:20:24+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.9.3", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "007c053ae6f31bba39dfa19a7726f56e9763bbea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/007c053ae6f31bba39dfa19a7726f56e9763bbea", + "reference": "007c053ae6f31bba39dfa19a7726f56e9763bbea", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "replace": { + "myclabs/deep-copy": "self.version" + }, + "require-dev": { + "doctrine/collections": "^1.0", + "doctrine/common": "^2.6", + "phpunit/phpunit": "^7.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + }, + "files": [ + "src/DeepCopy/deep_copy.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "time": "2019-08-09T12:45:53+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v4.3.0", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "9a9981c347c5c49d6dfe5cf826bb882b824080dc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/9a9981c347c5c49d6dfe5cf826bb882b824080dc", + "reference": "9a9981c347c5c49d6dfe5cf826bb882b824080dc", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=7.0" + }, + "require-dev": { + "ircmaxell/php-yacc": "0.0.5", + "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.3-dev" + } + }, + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "time": "2019-11-08T13:50:10+00:00" + }, + { + "name": "phar-io/manifest", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", + "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-phar": "*", + "phar-io/version": "^2.0", + "php": "^5.6 || ^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "time": "2018-07-08T19:23:20+00:00" + }, + { + "name": "phar-io/version", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/45a2ec53a73c70ce41d55cedef9063630abaf1b6", + "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Library for handling version information and constraints", + "time": "2018-07-08T19:19:57+00:00" + }, + { + "name": "phpdocumentor/reflection-common", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionCommon.git", + "reference": "63a995caa1ca9e5590304cd845c15ad6d482a62a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/63a995caa1ca9e5590304cd845c15ad6d482a62a", + "reference": "63a995caa1ca9e5590304cd845c15ad6d482a62a", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "require-dev": { + "phpunit/phpunit": "~6" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "Common reflection classes used by phpdocumentor to reflect the code structure", + "homepage": "http://www.phpdoc.org", + "keywords": [ + "FQSEN", + "phpDocumentor", + "phpdoc", + "reflection", + "static analysis" + ], + "time": "2018-08-07T13:53:10+00:00" + }, + { + "name": "phpdocumentor/reflection-docblock", + "version": "4.3.2", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "b83ff7cfcfee7827e1e78b637a5904fe6a96698e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/b83ff7cfcfee7827e1e78b637a5904fe6a96698e", + "reference": "b83ff7cfcfee7827e1e78b637a5904fe6a96698e", + "shasum": "" + }, + "require": { + "php": "^7.0", + "phpdocumentor/reflection-common": "^1.0.0 || ^2.0.0", + "phpdocumentor/type-resolver": "~0.4 || ^1.0.0", + "webmozart/assert": "^1.0" + }, + "require-dev": { + "doctrine/instantiator": "^1.0.5", + "mockery/mockery": "^1.0", + "phpunit/phpunit": "^6.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", + "time": "2019-09-12T14:27:41+00:00" + }, + { + "name": "phpdocumentor/type-resolver", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "2e32a6d48972b2c1976ed5d8967145b6cec4a4a9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/2e32a6d48972b2c1976ed5d8967145b6cec4a4a9", + "reference": "2e32a6d48972b2c1976ed5d8967145b6cec4a4a9", + "shasum": "" + }, + "require": { + "php": "^7.1", + "phpdocumentor/reflection-common": "^2.0" + }, + "require-dev": { + "ext-tokenizer": "^7.1", + "mockery/mockery": "~1", + "phpunit/phpunit": "^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", + "time": "2019-08-22T18:11:29+00:00" + }, + { + "name": "phploc/phploc", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phploc.git", + "reference": "6a8a9416517b82d6326ac9c2d040ad53c13654eb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phploc/zipball/6a8a9416517b82d6326ac9c2d040ad53c13654eb", + "reference": "6a8a9416517b82d6326ac9c2d040ad53c13654eb", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0", + "sebastian/finder-facade": "^1.1", + "sebastian/version": "^2.0", + "symfony/console": "^2.7|^3.0|^4.0" + }, + "bin": [ + "phploc" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "A tool for quickly measuring the size of a PHP project.", + "homepage": "https://github.com/sebastianbergmann/phploc", + "time": "2017-11-18T17:35:43+00:00" + }, + { + "name": "phpmetrics/phpmetrics", + "version": "v2.4.1", + "source": { + "type": "git", + "url": "https://github.com/phpmetrics/PhpMetrics.git", + "reference": "39095017413805cd6d9ada16cfaf8aaffcb2fec4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpmetrics/PhpMetrics/zipball/39095017413805cd6d9ada16cfaf8aaffcb2fec4", + "reference": "39095017413805cd6d9ada16cfaf8aaffcb2fec4", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-tokenizer": "*", + "nikic/php-parser": "^3|^4", + "php": ">=5.5" + }, + "replace": { + "halleck45/php-metrics": "*", + "halleck45/phpmetrics": "*" + }, + "require-dev": { + "phpunit/phpunit": ">=4.8.27,<=5.7.13", + "sebastian/comparator": ">=1.2.3" + }, + "bin": [ + "bin/phpmetrics" + ], + "type": "library", + "autoload": { + "psr-0": { + "Hal\\": "./src/" + }, + "files": [ + "./src/functions.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jean-François Lépine", + "email": "lepinejeanfrancois@yahoo.fr", + "homepage": "http://www.lepine.pro", + "role": "Copyright Holder" + } + ], + "description": "Static analyzer tool for PHP : Coupling, Cyclomatic complexity, Maintainability Index, Halstead's metrics... and more !", + "homepage": "http://www.phpmetrics.org", + "keywords": [ + "analysis", + "qa", + "quality", + "testing" + ], + "time": "2018-07-10T17:19:33+00:00" + }, + { + "name": "phpspec/prophecy", + "version": "1.9.0", + "source": { + "type": "git", + "url": "https://github.com/phpspec/prophecy.git", + "reference": "f6811d96d97bdf400077a0cc100ae56aa32b9203" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/f6811d96d97bdf400077a0cc100ae56aa32b9203", + "reference": "f6811d96d97bdf400077a0cc100ae56aa32b9203", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.0.2", + "php": "^5.3|^7.0", + "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0|^5.0", + "sebastian/comparator": "^1.1|^2.0|^3.0", + "sebastian/recursion-context": "^1.0|^2.0|^3.0" + }, + "require-dev": { + "phpspec/phpspec": "^2.5|^3.2", + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5 || ^7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Prophecy\\": "src/Prophecy" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Konstantin Kudryashov", + "email": "ever.zet@gmail.com", + "homepage": "http://everzet.com" + }, + { + "name": "Marcello Duarte", + "email": "marcello.duarte@gmail.com" + } + ], + "description": "Highly opinionated mocking framework for PHP 5.3+", + "homepage": "https://github.com/phpspec/prophecy", + "keywords": [ + "Double", + "Dummy", + "fake", + "mock", + "spy", + "stub" + ], + "time": "2019-10-03T11:07:50+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "6.1.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "807e6013b00af69b6c5d9ceb4282d0393dbb9d8d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/807e6013b00af69b6c5d9ceb4282d0393dbb9d8d", + "reference": "807e6013b00af69b6c5d9ceb4282d0393dbb9d8d", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-xmlwriter": "*", + "php": "^7.1", + "phpunit/php-file-iterator": "^2.0", + "phpunit/php-text-template": "^1.2.1", + "phpunit/php-token-stream": "^3.0", + "sebastian/code-unit-reverse-lookup": "^1.0.1", + "sebastian/environment": "^3.1 || ^4.0", + "sebastian/version": "^2.0.1", + "theseer/tokenizer": "^1.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.0" + }, + "suggest": { + "ext-xdebug": "^2.6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "time": "2018-10-31T16:06:48+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "050bedf145a257b1ff02746c31894800e5122946" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/050bedf145a257b1ff02746c31894800e5122946", + "reference": "050bedf145a257b1ff02746c31894800e5122946", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "time": "2018-09-13T20:33:42+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", + "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "time": "2015-06-21T13:50:34+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "2.1.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "1038454804406b0b5f5f520358e78c1c2f71501e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/1038454804406b0b5f5f520358e78c1c2f71501e", + "reference": "1038454804406b0b5f5f520358e78c1c2f71501e", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "time": "2019-06-07T04:22:29+00:00" + }, + { + "name": "phpunit/php-token-stream", + "version": "3.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-token-stream.git", + "reference": "995192df77f63a59e47f025390d2d1fdf8f425ff" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/995192df77f63a59e47f025390d2d1fdf8f425ff", + "reference": "995192df77f63a59e47f025390d2d1fdf8f425ff", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": "^7.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Wrapper around PHP's tokenizer extension.", + "homepage": "https://github.com/sebastianbergmann/php-token-stream/", + "keywords": [ + "tokenizer" + ], + "time": "2019-09-17T06:23:10+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "7.5.17", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "4c92a15296e58191a4cd74cff3b34fc8e374174a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/4c92a15296e58191a4cd74cff3b34fc8e374174a", + "reference": "4c92a15296e58191a4cd74cff3b34fc8e374174a", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.1", + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "myclabs/deep-copy": "^1.7", + "phar-io/manifest": "^1.0.2", + "phar-io/version": "^2.0", + "php": "^7.1", + "phpspec/prophecy": "^1.7", + "phpunit/php-code-coverage": "^6.0.7", + "phpunit/php-file-iterator": "^2.0.1", + "phpunit/php-text-template": "^1.2.1", + "phpunit/php-timer": "^2.1", + "sebastian/comparator": "^3.0", + "sebastian/diff": "^3.0", + "sebastian/environment": "^4.0", + "sebastian/exporter": "^3.1", + "sebastian/global-state": "^2.0", + "sebastian/object-enumerator": "^3.0.3", + "sebastian/resource-operations": "^2.0", + "sebastian/version": "^2.0.1" + }, + "conflict": { + "phpunit/phpunit-mock-objects": "*" + }, + "require-dev": { + "ext-pdo": "*" + }, + "suggest": { + "ext-soap": "*", + "ext-xdebug": "*", + "phpunit/php-invoker": "^2.0" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "7.5-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "time": "2019-10-28T10:37:36+00:00" + }, + { + "name": "psr/cache", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/cache.git", + "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", + "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for caching libraries", + "keywords": [ + "cache", + "psr", + "psr-6" + ], + "time": "2016-08-06T20:24:11+00:00" + }, + { + "name": "roave/security-advisories", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/Roave/SecurityAdvisories.git", + "reference": "e4ee2c8e4ccd908debc64069faf023c684a76760" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/e4ee2c8e4ccd908debc64069faf023c684a76760", + "reference": "e4ee2c8e4ccd908debc64069faf023c684a76760", + "shasum": "" + }, + "conflict": { + "3f/pygmentize": "<1.2", + "adodb/adodb-php": "<5.20.12", + "alterphp/easyadmin-extension-bundle": ">=1.2,<1.2.11|>=1.3,<1.3.1", + "amphp/artax": "<1.0.6|>=2,<2.0.6", + "amphp/http": "<1.0.1", + "api-platform/core": ">=2.2,<2.2.10|>=2.3,<2.3.6", + "asymmetricrypt/asymmetricrypt": ">=0,<9.9.99", + "aws/aws-sdk-php": ">=3,<3.2.1", + "brightlocal/phpwhois": "<=4.2.5", + "bugsnag/bugsnag-laravel": ">=2,<2.0.2", + "cakephp/cakephp": ">=1.3,<1.3.18|>=2,<2.4.99|>=2.5,<2.5.99|>=2.6,<2.6.12|>=2.7,<2.7.6|>=3,<3.5.18|>=3.6,<3.6.15|>=3.7,<3.7.7", + "cart2quote/module-quotation": ">=4.1.6,<=4.4.5|>=5,<5.4.4", + "cartalyst/sentry": "<=2.1.6", + "codeigniter/framework": "<=3.0.6", + "composer/composer": "<=1-alpha.11", + "contao-components/mediaelement": ">=2.14.2,<2.21.1", + "contao/core": ">=2,<3.5.39", + "contao/core-bundle": ">=4,<4.4.39|>=4.5,<4.7.5", + "contao/listing-bundle": ">=4,<4.4.8", + "datadog/dd-trace": ">=0.30,<0.30.2", + "david-garcia/phpwhois": "<=4.3.1", + "doctrine/annotations": ">=1,<1.2.7", + "doctrine/cache": ">=1,<1.3.2|>=1.4,<1.4.2", + "doctrine/common": ">=2,<2.4.3|>=2.5,<2.5.1", + "doctrine/dbal": ">=2,<2.0.8|>=2.1,<2.1.2", + "doctrine/doctrine-bundle": "<1.5.2", + "doctrine/doctrine-module": "<=0.7.1", + "doctrine/mongodb-odm": ">=1,<1.0.2", + "doctrine/mongodb-odm-bundle": ">=2,<3.0.1", + "doctrine/orm": ">=2,<2.4.8|>=2.5,<2.5.1", + "dompdf/dompdf": ">=0.6,<0.6.2", + "drupal/core": ">=7,<7.67|>=8,<8.6.16|>=8.7,<8.7.1|>8.7.3,<8.7.5", + "drupal/drupal": ">=7,<7.67|>=8,<8.6.16|>=8.7,<8.7.1|>8.7.3,<8.7.5", + "erusev/parsedown": "<1.7.2", + "ezsystems/ezplatform-admin-ui": ">=1.3,<1.3.5|>=1.4,<1.4.4", + "ezsystems/ezpublish-kernel": ">=5.3,<5.3.12.1|>=5.4,<5.4.13.1|>=6,<6.7.9.1|>=6.8,<6.13.5.1|>=7,<7.2.4.1|>=7.3,<7.3.2.1", + "ezsystems/ezpublish-legacy": ">=5.3,<5.3.12.6|>=5.4,<5.4.12.3|>=2011,<2017.12.4.3|>=2018.6,<2018.6.1.4|>=2018.9,<2018.9.1.3", + "ezsystems/repository-forms": ">=2.3,<2.3.2.1", + "ezyang/htmlpurifier": "<4.1.1", + "firebase/php-jwt": "<2", + "fooman/tcpdf": "<6.2.22", + "fossar/tcpdf-parser": "<6.2.22", + "friendsofsymfony/rest-bundle": ">=1.2,<1.2.2", + "friendsofsymfony/user-bundle": ">=1.2,<1.3.5", + "fuel/core": "<1.8.1", + "gree/jose": "<=2.2", + "gregwar/rst": "<1.0.3", + "guzzlehttp/guzzle": ">=4-rc.2,<4.2.4|>=5,<5.3.1|>=6,<6.2.1", + "illuminate/auth": ">=4,<4.0.99|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.10", + "illuminate/cookie": ">=4,<=4.0.11|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.42|>=5.6,<5.6.30", + "illuminate/database": ">=4,<4.0.99|>=4.1,<4.1.29", + "illuminate/encryption": ">=4,<=4.0.11|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.40|>=5.6,<5.6.15", + "ivankristianto/phpwhois": "<=4.3", + "james-heinrich/getid3": "<1.9.9", + "joomla/session": "<1.3.1", + "jsmitty12/phpwhois": "<5.1", + "kazist/phpwhois": "<=4.2.6", + "kreait/firebase-php": ">=3.2,<3.8.1", + "la-haute-societe/tcpdf": "<6.2.22", + "laravel/framework": ">=4,<4.0.99|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.42|>=5.6,<5.6.30", + "laravel/socialite": ">=1,<1.0.99|>=2,<2.0.10", + "league/commonmark": "<0.18.3", + "magento/magento1ce": "<1.9.4.3", + "magento/magento1ee": ">=1,<1.14.4.3", + "magento/product-community-edition": ">=2,<2.2.10|>=2.3,<2.3.2", + "monolog/monolog": ">=1.8,<1.12", + "namshi/jose": "<2.2", + "onelogin/php-saml": "<2.10.4", + "openid/php-openid": "<2.3", + "oro/crm": ">=1.7,<1.7.4", + "oro/platform": ">=1.7,<1.7.4", + "padraic/humbug_get_contents": "<1.1.2", + "pagarme/pagarme-php": ">=0,<3", + "paragonie/random_compat": "<2", + "paypal/merchant-sdk-php": "<3.12", + "pear/archive_tar": "<1.4.4", + "phpmailer/phpmailer": ">=5,<5.2.27|>=6,<6.0.6", + "phpoffice/phpexcel": "<=1.8.1", + "phpoffice/phpspreadsheet": "<=1.5", + "phpunit/phpunit": ">=4.8.19,<4.8.28|>=5.0.10,<5.6.3", + "phpwhois/phpwhois": "<=4.2.5", + "phpxmlrpc/extras": "<0.6.1", + "propel/propel": ">=2-alpha.1,<=2-alpha.7", + "propel/propel1": ">=1,<=1.7.1", + "pusher/pusher-php-server": "<2.2.1", + "robrichards/xmlseclibs": ">=1,<3.0.4", + "sabre/dav": ">=1.6,<1.6.99|>=1.7,<1.7.11|>=1.8,<1.8.9", + "sensiolabs/connect": "<4.2.3", + "serluck/phpwhois": "<=4.2.6", + "shopware/shopware": "<5.3.7", + "silverstripe/cms": ">=3,<=3.0.11|>=3.1,<3.1.11", + "silverstripe/forum": "<=0.6.1|>=0.7,<=0.7.3", + "silverstripe/framework": ">=3,<3.6.7|>=3.7,<3.7.3|>=4,<4.4", + "silverstripe/graphql": ">=2,<2.0.5|>=3,<3.1.2", + "silverstripe/registry": ">=2.1,<2.1.2|>=2.2,<2.2.1", + "silverstripe/restfulserver": ">=1,<1.0.9|>=2,<2.0.4", + "silverstripe/userforms": "<3", + "simple-updates/phpwhois": "<=1", + "simplesamlphp/saml2": "<1.10.6|>=2,<2.3.8|>=3,<3.1.4", + "simplesamlphp/simplesamlphp": "<1.17.8", + "simplesamlphp/simplesamlphp-module-infocard": "<1.0.1", + "slim/slim": "<2.6", + "smarty/smarty": "<3.1.33", + "socalnick/scn-social-auth": "<1.15.2", + "spoonity/tcpdf": "<6.2.22", + "squizlabs/php_codesniffer": ">=1,<2.8.1|>=3,<3.0.1", + "stormpath/sdk": ">=0,<9.9.99", + "studio-42/elfinder": "<2.1.48", + "swiftmailer/swiftmailer": ">=4,<5.4.5", + "sylius/admin-bundle": ">=1,<1.0.17|>=1.1,<1.1.9|>=1.2,<1.2.2", + "sylius/grid": ">=1,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1", + "sylius/grid-bundle": ">=1,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1", + "sylius/sylius": ">=1,<1.1.18|>=1.2,<1.2.17|>=1.3,<1.3.12|>=1.4,<1.4.4", + "symfony/cache": ">=3.1,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8", + "symfony/dependency-injection": ">=2,<2.0.17|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/form": ">=2.3,<2.3.35|>=2.4,<2.6.12|>=2.7,<2.7.50|>=2.8,<2.8.49|>=3,<3.4.20|>=4,<4.0.15|>=4.1,<4.1.9|>=4.2,<4.2.1", + "symfony/framework-bundle": ">=2,<2.3.18|>=2.4,<2.4.8|>=2.5,<2.5.2|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/http-foundation": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8", + "symfony/http-kernel": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8", + "symfony/intl": ">=2.7,<2.7.38|>=2.8,<2.8.31|>=3,<3.2.14|>=3.3,<3.3.13", + "symfony/mime": ">=4.3,<4.3.8", + "symfony/phpunit-bridge": ">=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/polyfill": ">=1,<1.10", + "symfony/polyfill-php55": ">=1,<1.10", + "symfony/proxy-manager-bridge": ">=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/routing": ">=2,<2.0.19", + "symfony/security": ">=2,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/security-bundle": ">=2,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", + "symfony/security-core": ">=2.4,<2.6.13|>=2.7,<2.7.9|>=2.7.30,<2.7.32|>=2.8,<2.8.37|>=3,<3.3.17|>=3.4,<3.4.7|>=4,<4.0.7", + "symfony/security-csrf": ">=2.4,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", + "symfony/security-guard": ">=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", + "symfony/security-http": ">=2.3,<2.3.41|>=2.4,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.2.12|>=4.3,<4.3.8", + "symfony/serializer": ">=2,<2.0.11", + "symfony/symfony": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8", + "symfony/translation": ">=2,<2.0.17", + "symfony/validator": ">=2,<2.0.24|>=2.1,<2.1.12|>=2.2,<2.2.5|>=2.3,<2.3.3", + "symfony/var-exporter": ">=4.2,<4.2.12|>=4.3,<4.3.8", + "symfony/web-profiler-bundle": ">=2,<2.3.19|>=2.4,<2.4.9|>=2.5,<2.5.4", + "symfony/yaml": ">=2,<2.0.22|>=2.1,<2.1.7", + "tecnickcom/tcpdf": "<6.2.22", + "thelia/backoffice-default-template": ">=2.1,<2.1.2", + "thelia/thelia": ">=2.1-beta.1,<2.1.3", + "theonedemon/phpwhois": "<=4.2.5", + "titon/framework": ">=0,<9.9.99", + "truckersmp/phpwhois": "<=4.3.1", + "twig/twig": "<1.38|>=2,<2.7", + "typo3/cms": ">=6.2,<6.2.30|>=7,<7.6.32|>=8,<8.7.27|>=9,<9.5.8", + "typo3/cms-core": ">=8,<8.7.27|>=9,<9.5.8", + "typo3/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.10|>=3.1,<3.1.7|>=3.2,<3.2.7|>=3.3,<3.3.5", + "typo3/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4", + "typo3/phar-stream-wrapper": ">=1,<2.1.1|>=3,<3.1.1", + "ua-parser/uap-php": "<3.8", + "wallabag/tcpdf": "<6.2.22", + "willdurand/js-translation-bundle": "<2.1.1", + "yiisoft/yii": ">=1.1.14,<1.1.15", + "yiisoft/yii2": "<2.0.15", + "yiisoft/yii2-bootstrap": "<2.0.4", + "yiisoft/yii2-dev": "<2.0.15", + "yiisoft/yii2-elasticsearch": "<2.0.5", + "yiisoft/yii2-gii": "<2.0.4", + "yiisoft/yii2-jui": "<2.0.4", + "yiisoft/yii2-redis": "<2.0.8", + "zendframework/zend-cache": ">=2.4,<2.4.8|>=2.5,<2.5.3", + "zendframework/zend-captcha": ">=2,<2.4.9|>=2.5,<2.5.2", + "zendframework/zend-crypt": ">=2,<2.4.9|>=2.5,<2.5.2", + "zendframework/zend-db": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.10|>=2.3,<2.3.5", + "zendframework/zend-developer-tools": ">=1.2.2,<1.2.3", + "zendframework/zend-diactoros": ">=1,<1.8.4", + "zendframework/zend-feed": ">=1,<2.10.3", + "zendframework/zend-form": ">=2,<2.2.7|>=2.3,<2.3.1", + "zendframework/zend-http": ">=1,<2.8.1", + "zendframework/zend-json": ">=2.1,<2.1.6|>=2.2,<2.2.6", + "zendframework/zend-ldap": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.8|>=2.3,<2.3.3", + "zendframework/zend-mail": ">=2,<2.4.11|>=2.5,<2.7.2", + "zendframework/zend-navigation": ">=2,<2.2.7|>=2.3,<2.3.1", + "zendframework/zend-session": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.9|>=2.3,<2.3.4", + "zendframework/zend-validator": ">=2.3,<2.3.6", + "zendframework/zend-view": ">=2,<2.2.7|>=2.3,<2.3.1", + "zendframework/zend-xmlrpc": ">=2.1,<2.1.6|>=2.2,<2.2.6", + "zendframework/zendframework": "<2.5.1", + "zendframework/zendframework1": "<1.12.20", + "zendframework/zendopenid": ">=2,<2.0.2", + "zendframework/zendxml": ">=1,<1.0.1", + "zetacomponents/mail": "<1.8.2", + "zf-commons/zfc-user": "<1.2.2", + "zfcampus/zf-apigility-doctrine": ">=1,<1.0.3", + "zfr/zfr-oauth2-server-module": "<0.1.2" + }, + "type": "metapackage", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "role": "maintainer" + } + ], + "description": "Prevents installation of composer packages with known security vulnerabilities: no API, simply require it", + "time": "2019-12-02T13:03:15+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", + "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^5.7 || ^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "time": "2017-03-04T06:30:41+00:00" + }, + { + "name": "sebastian/comparator", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/5de4fc177adf9bce8df98d8d141a7559d7ccf6da", + "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da", + "shasum": "" + }, + "require": { + "php": "^7.1", + "sebastian/diff": "^3.0", + "sebastian/exporter": "^3.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "https://github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "time": "2018-07-12T15:12:46+00:00" + }, + { + "name": "sebastian/diff", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/720fcc7e9b5cf384ea68d9d930d480907a0c1a29", + "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.5 || ^8.0", + "symfony/process": "^2 || ^3.3 || ^4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "time": "2019-02-04T06:01:07+00:00" + }, + { + "name": "sebastian/environment", + "version": "4.2.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "464c90d7bdf5ad4e8a6aea15c091fec0603d4368" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/464c90d7bdf5ad4e8a6aea15c091fec0603d4368", + "reference": "464c90d7bdf5ad4e8a6aea15c091fec0603d4368", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.5" + }, + "suggest": { + "ext-posix": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "http://www.github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "time": "2019-11-20T08:46:58+00:00" + }, + { + "name": "sebastian/exporter", + "version": "3.1.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/68609e1261d215ea5b21b7987539cbfbe156ec3e", + "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e", + "shasum": "" + }, + "require": { + "php": "^7.0", + "sebastian/recursion-context": "^3.0" + }, + "require-dev": { + "ext-mbstring": "*", + "phpunit/phpunit": "^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "http://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "time": "2019-09-14T09:02:43+00:00" + }, + { + "name": "sebastian/finder-facade", + "version": "1.2.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/finder-facade.git", + "reference": "4a3174709c2dc565fe5fb26fcf827f6a1fc7b09f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/finder-facade/zipball/4a3174709c2dc565fe5fb26fcf827f6a1fc7b09f", + "reference": "4a3174709c2dc565fe5fb26fcf827f6a1fc7b09f", + "shasum": "" + }, + "require": { + "symfony/finder": "~2.3|~3.0|~4.0", + "theseer/fdomdocument": "~1.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "FinderFacade is a convenience wrapper for Symfony's Finder component.", + "homepage": "https://github.com/sebastianbergmann/finder-facade", + "time": "2017-11-18T17:31:49+00:00" + }, + { + "name": "sebastian/global-state", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4", + "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4", + "shasum": "" + }, + "require": { + "php": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "suggest": { + "ext-uopz": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "http://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "time": "2017-04-27T15:39:26+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/7cfd9e65d11ffb5af41198476395774d4c8a84c5", + "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5", + "shasum": "" + }, + "require": { + "php": "^7.0", + "sebastian/object-reflector": "^1.1.1", + "sebastian/recursion-context": "^3.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "time": "2017-08-03T12:35:26+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "773f97c67f28de00d397be301821b06708fca0be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/773f97c67f28de00d397be301821b06708fca0be", + "reference": "773f97c67f28de00d397be301821b06708fca0be", + "shasum": "" + }, + "require": { + "php": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "time": "2017-03-29T09:07:27+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", + "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", + "shasum": "" + }, + "require": { + "php": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "http://www.github.com/sebastianbergmann/recursion-context", + "time": "2017-03-03T06:23:57+00:00" + }, + { + "name": "sebastian/resource-operations", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/resource-operations.git", + "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/4d7a795d35b889bf80a0cc04e08d77cedfa917a9", + "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides a list of PHP built-in functions that operate on resources", + "homepage": "https://www.github.com/sebastianbergmann/resource-operations", + "time": "2018-10-04T04:07:39+00:00" + }, + { + "name": "sebastian/version", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019", + "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "time": "2016-10-03T07:35:21+00:00" + }, + { + "name": "symfony/cache", + "version": "v4.4.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/cache.git", + "reference": "de737c81ea95018d11a3ef908ad2ebf203741b96" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/cache/zipball/de737c81ea95018d11a3ef908ad2ebf203741b96", + "reference": "de737c81ea95018d11a3ef908ad2ebf203741b96", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "psr/cache": "~1.0", + "psr/log": "~1.0", + "symfony/cache-contracts": "^1.1.7|^2", + "symfony/service-contracts": "^1.1|^2", + "symfony/var-exporter": "^4.2|^5.0" + }, + "conflict": { + "doctrine/dbal": "<2.5", + "symfony/dependency-injection": "<3.4", + "symfony/http-kernel": "<4.4", + "symfony/var-dumper": "<4.4" + }, + "provide": { + "psr/cache-implementation": "1.0", + "psr/simple-cache-implementation": "1.0", + "symfony/cache-implementation": "1.0" + }, + "require-dev": { + "cache/integration-tests": "dev-master", + "doctrine/cache": "~1.6", + "doctrine/dbal": "~2.5", + "predis/predis": "~1.1", + "psr/simple-cache": "^1.0", + "symfony/config": "^4.2|^5.0", + "symfony/dependency-injection": "^3.4|^4.1|^5.0", + "symfony/var-dumper": "^4.4|^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Cache\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Cache component with PSR-6, PSR-16, and tags", + "homepage": "https://symfony.com", + "keywords": [ + "caching", + "psr6" + ], + "time": "2019-12-01T10:50:45+00:00" + }, + { + "name": "symfony/cache-contracts", + "version": "v1.1.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/cache-contracts.git", + "reference": "af50d14ada9e4e82cfabfabdc502d144f89be0a1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/af50d14ada9e4e82cfabfabdc502d144f89be0a1", + "reference": "af50d14ada9e4e82cfabfabdc502d144f89be0a1", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "psr/cache": "^1.0" + }, + "suggest": { + "symfony/cache-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Cache\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to caching", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "time": "2019-10-04T21:43:27+00:00" + }, + { + "name": "symfony/debug", + "version": "v4.4.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/debug.git", + "reference": "b8600a1d7d20b0e80906398bb1f50612fa074a8e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/debug/zipball/b8600a1d7d20b0e80906398bb1f50612fa074a8e", + "reference": "b8600a1d7d20b0e80906398bb1f50612fa074a8e", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "psr/log": "~1.0" + }, + "conflict": { + "symfony/http-kernel": "<3.4" + }, + "require-dev": { + "symfony/http-kernel": "^3.4|^4.0|^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Debug\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Debug Component", + "homepage": "https://symfony.com", + "time": "2019-11-28T13:33:56+00:00" + }, + { + "name": "symfony/dependency-injection", + "version": "v4.4.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/dependency-injection.git", + "reference": "ad46a4def1325befab696b49c839dffea3fc92bd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/ad46a4def1325befab696b49c839dffea3fc92bd", + "reference": "ad46a4def1325befab696b49c839dffea3fc92bd", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "psr/container": "^1.0", + "symfony/service-contracts": "^1.1.6|^2" + }, + "conflict": { + "symfony/config": "<4.3|>=5.0", + "symfony/finder": "<3.4", + "symfony/proxy-manager-bridge": "<3.4", + "symfony/yaml": "<3.4" + }, + "provide": { + "psr/container-implementation": "1.0", + "symfony/service-implementation": "1.0" + }, + "require-dev": { + "symfony/config": "^4.3", + "symfony/expression-language": "^3.4|^4.0|^5.0", + "symfony/yaml": "^3.4|^4.0|^5.0" + }, + "suggest": { + "symfony/config": "", + "symfony/expression-language": "For using expressions in service container configuration", + "symfony/finder": "For using double-star glob patterns or when GLOB_BRACE portability is required", + "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them", + "symfony/yaml": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\DependencyInjection\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony DependencyInjection Component", + "homepage": "https://symfony.com", + "time": "2019-12-01T10:19:36+00:00" + }, + { + "name": "symfony/doctrine-bridge", + "version": "v4.4.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/doctrine-bridge.git", + "reference": "31c3d72f9e7a03e1b9d136084a9201c2225ee348" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/31c3d72f9e7a03e1b9d136084a9201c2225ee348", + "reference": "31c3d72f9e7a03e1b9d136084a9201c2225ee348", + "shasum": "" + }, + "require": { + "doctrine/event-manager": "~1.0", + "doctrine/persistence": "~1.0", + "php": "^7.1.3", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.0", + "symfony/service-contracts": "^1.1|^2" + }, + "conflict": { + "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0", + "symfony/dependency-injection": "<3.4", + "symfony/form": "<4.4", + "symfony/http-kernel": "<4.3.7", + "symfony/messenger": "<4.3", + "symfony/security-core": "<4.4", + "symfony/validator": "<4.4" + }, + "require-dev": { + "doctrine/annotations": "~1.7", + "doctrine/cache": "~1.6", + "doctrine/collections": "~1.0", + "doctrine/data-fixtures": "1.0.*", + "doctrine/dbal": "~2.4", + "doctrine/orm": "^2.6.3", + "doctrine/reflection": "~1.0", + "symfony/config": "^4.2|^5.0", + "symfony/dependency-injection": "^3.4|^4.0|^5.0", + "symfony/expression-language": "^3.4|^4.0|^5.0", + "symfony/form": "^4.4|^5.0", + "symfony/http-kernel": "^4.3.7", + "symfony/messenger": "^4.4|^5.0", + "symfony/property-access": "^3.4|^4.0|^5.0", + "symfony/property-info": "^3.4|^4.0|^5.0", + "symfony/proxy-manager-bridge": "^3.4|^4.0|^5.0", + "symfony/security-core": "^4.4|^5.0", + "symfony/stopwatch": "^3.4|^4.0|^5.0", + "symfony/translation": "^3.4|^4.0|^5.0", + "symfony/validator": "^4.4|^5.0", + "symfony/var-dumper": "^3.4|^4.0|^5.0" + }, + "suggest": { + "doctrine/data-fixtures": "", + "doctrine/dbal": "", + "doctrine/orm": "", + "symfony/form": "", + "symfony/property-info": "", + "symfony/validator": "" + }, + "type": "symfony-bridge", + "extra": { + "branch-alias": { + "dev-master": "4.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Bridge\\Doctrine\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Doctrine Bridge", + "homepage": "https://symfony.com", + "time": "2019-12-01T08:39:58+00:00" + }, + { + "name": "symfony/error-handler", + "version": "v4.4.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/error-handler.git", + "reference": "a1ad02d62789efed1d2b2796f1c15e0c6a00fc3b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/a1ad02d62789efed1d2b2796f1c15e0c6a00fc3b", + "reference": "a1ad02d62789efed1d2b2796f1c15e0c6a00fc3b", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "psr/log": "~1.0", + "symfony/debug": "^4.4", + "symfony/var-dumper": "^4.4|^5.0" + }, + "require-dev": { + "symfony/http-kernel": "^4.4|^5.0", + "symfony/serializer": "^4.4|^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\ErrorHandler\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony ErrorHandler Component", + "homepage": "https://symfony.com", + "time": "2019-12-01T08:46:01+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v4.4.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "b3c3068a72623287550fe20b84a2b01dcba2686f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/b3c3068a72623287550fe20b84a2b01dcba2686f", + "reference": "b3c3068a72623287550fe20b84a2b01dcba2686f", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/event-dispatcher-contracts": "^1.1" + }, + "conflict": { + "symfony/dependency-injection": "<3.4" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "1.1" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "^3.4|^4.0|^5.0", + "symfony/dependency-injection": "^3.4|^4.0|^5.0", + "symfony/expression-language": "^3.4|^4.0|^5.0", + "symfony/http-foundation": "^3.4|^4.0|^5.0", + "symfony/service-contracts": "^1.1|^2", + "symfony/stopwatch": "^3.4|^4.0|^5.0" + }, + "suggest": { + "symfony/dependency-injection": "", + "symfony/http-kernel": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony EventDispatcher Component", + "homepage": "https://symfony.com", + "time": "2019-11-28T13:33:56+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v1.1.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "c43ab685673fb6c8d84220c77897b1d6cdbe1d18" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/c43ab685673fb6c8d84220c77897b1d6cdbe1d18", + "reference": "c43ab685673fb6c8d84220c77897b1d6cdbe1d18", + "shasum": "" + }, + "require": { + "php": "^7.1.3" + }, + "suggest": { + "psr/event-dispatcher": "", + "symfony/event-dispatcher-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "time": "2019-09-17T09:54:03+00:00" + }, + { + "name": "symfony/framework-bundle", + "version": "v4.4.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/framework-bundle.git", + "reference": "69ac426bfaca9270e549cea184eece00357f2675" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/69ac426bfaca9270e549cea184eece00357f2675", + "reference": "69ac426bfaca9270e549cea184eece00357f2675", + "shasum": "" + }, + "require": { + "ext-xml": "*", + "php": "^7.1.3", + "symfony/cache": "^4.4|^5.0", + "symfony/config": "^4.3.4|^5.0", + "symfony/dependency-injection": "^4.4.1|^5.0.1", + "symfony/error-handler": "^4.4.1|^5.0.1", + "symfony/filesystem": "^3.4|^4.0|^5.0", + "symfony/finder": "^3.4|^4.0|^5.0", + "symfony/http-foundation": "^4.4|^5.0", + "symfony/http-kernel": "^4.4", + "symfony/polyfill-mbstring": "~1.0", + "symfony/routing": "^4.4|^5.0" + }, + "conflict": { + "phpdocumentor/reflection-docblock": "<3.0", + "phpdocumentor/type-resolver": "<0.2.1", + "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0", + "symfony/asset": "<3.4", + "symfony/browser-kit": "<4.3", + "symfony/console": "<4.3", + "symfony/dom-crawler": "<4.3", + "symfony/dotenv": "<4.3.6", + "symfony/form": "<4.3.5", + "symfony/http-client": "<4.4", + "symfony/lock": "<4.4", + "symfony/mailer": "<4.4", + "symfony/messenger": "<4.4", + "symfony/mime": "<4.4", + "symfony/property-info": "<3.4", + "symfony/security-bundle": "<4.4", + "symfony/serializer": "<4.4", + "symfony/stopwatch": "<3.4", + "symfony/translation": "<4.4", + "symfony/twig-bridge": "<4.1.1", + "symfony/twig-bundle": "<4.4", + "symfony/validator": "<4.4", + "symfony/web-profiler-bundle": "<4.4", + "symfony/workflow": "<4.3.6" + }, + "require-dev": { + "doctrine/annotations": "~1.7", + "doctrine/cache": "~1.0", + "paragonie/sodium_compat": "^1.8", + "phpdocumentor/reflection-docblock": "^3.0|^4.0", + "symfony/asset": "^3.4|^4.0|^5.0", + "symfony/browser-kit": "^4.3|^5.0", + "symfony/console": "^4.3.4|^5.0", + "symfony/css-selector": "^3.4|^4.0|^5.0", + "symfony/dom-crawler": "^4.3|^5.0", + "symfony/dotenv": "^4.3.6|^5.0", + "symfony/expression-language": "^3.4|^4.0|^5.0", + "symfony/form": "^4.3.5|^5.0", + "symfony/http-client": "^4.4|^5.0", + "symfony/lock": "^4.4|^5.0", + "symfony/mailer": "^4.4|^5.0", + "symfony/messenger": "^4.4|^5.0", + "symfony/mime": "^4.4|^5.0", + "symfony/polyfill-intl-icu": "~1.0", + "symfony/process": "^3.4|^4.0|^5.0", + "symfony/property-info": "^3.4|^4.0|^5.0", + "symfony/security-csrf": "^3.4|^4.0|^5.0", + "symfony/security-http": "^3.4|^4.0|^5.0", + "symfony/serializer": "^4.4|^5.0", + "symfony/stopwatch": "^3.4|^4.0|^5.0", + "symfony/templating": "^3.4|^4.0|^5.0", + "symfony/translation": "^4.4|^5.0", + "symfony/twig-bundle": "^4.4|^5.0", + "symfony/validator": "^4.4|^5.0", + "symfony/web-link": "^4.4|^5.0", + "symfony/workflow": "^4.3.6|^5.0", + "symfony/yaml": "^3.4|^4.0|^5.0", + "twig/twig": "^1.41|^2.10|^3.0" + }, + "suggest": { + "ext-apcu": "For best performance of the system caches", + "symfony/console": "For using the console commands", + "symfony/form": "For using forms", + "symfony/property-info": "For using the property_info service", + "symfony/serializer": "For using the serializer service", + "symfony/validator": "For using validation", + "symfony/web-link": "For using web links, features such as preloading, prefetching or prerendering", + "symfony/yaml": "For using the debug:config and lint:yaml commands" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "4.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Bundle\\FrameworkBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony FrameworkBundle", + "homepage": "https://symfony.com", + "time": "2019-11-28T14:12:27+00:00" + }, + { + "name": "symfony/http-kernel", + "version": "v4.4.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-kernel.git", + "reference": "e4187780ed26129ee86d5234afbebf085e144f88" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/e4187780ed26129ee86d5234afbebf085e144f88", + "reference": "e4187780ed26129ee86d5234afbebf085e144f88", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "psr/log": "~1.0", + "symfony/error-handler": "^4.4", + "symfony/event-dispatcher": "^4.4", + "symfony/http-foundation": "^4.4|^5.0", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-php73": "^1.9" + }, + "conflict": { + "symfony/browser-kit": "<4.3", + "symfony/config": "<3.4", + "symfony/console": ">=5", + "symfony/dependency-injection": "<4.3", + "symfony/translation": "<4.2", + "twig/twig": "<1.34|<2.4,>=2" + }, + "provide": { + "psr/log-implementation": "1.0" + }, + "require-dev": { + "psr/cache": "~1.0", + "symfony/browser-kit": "^4.3|^5.0", + "symfony/config": "^3.4|^4.0|^5.0", + "symfony/console": "^3.4|^4.0", + "symfony/css-selector": "^3.4|^4.0|^5.0", + "symfony/dependency-injection": "^4.3|^5.0", + "symfony/dom-crawler": "^3.4|^4.0|^5.0", + "symfony/expression-language": "^3.4|^4.0|^5.0", + "symfony/finder": "^3.4|^4.0|^5.0", + "symfony/process": "^3.4|^4.0|^5.0", + "symfony/routing": "^3.4|^4.0|^5.0", + "symfony/stopwatch": "^3.4|^4.0|^5.0", + "symfony/templating": "^3.4|^4.0|^5.0", + "symfony/translation": "^4.2|^5.0", + "symfony/translation-contracts": "^1.1|^2", + "twig/twig": "^1.34|^2.4|^3.0" + }, + "suggest": { + "symfony/browser-kit": "", + "symfony/config": "", + "symfony/console": "", + "symfony/dependency-injection": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpKernel\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony HttpKernel Component", + "homepage": "https://symfony.com", + "time": "2019-12-01T14:06:38+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v4.4.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "0a89a1dbbedd9fb2cfb2336556dec8305273c19a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/0a89a1dbbedd9fb2cfb2336556dec8305273c19a", + "reference": "0a89a1dbbedd9fb2cfb2336556dec8305273c19a", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php72": "~1.5" + }, + "conflict": { + "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0", + "symfony/console": "<3.4" + }, + "require-dev": { + "ext-iconv": "*", + "symfony/console": "^3.4|^4.0|^5.0", + "symfony/process": "^4.4|^5.0", + "twig/twig": "^1.34|^2.4|^3.0" + }, + "suggest": { + "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", + "ext-intl": "To show region name in time zone dump", + "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" + }, + "bin": [ + "Resources/bin/var-dump-server" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.4-dev" + } + }, + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony mechanism for exploring and dumping PHP variables", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], + "time": "2019-11-28T13:33:56+00:00" + }, + { + "name": "symfony/var-exporter", + "version": "v4.4.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-exporter.git", + "reference": "e566070effe60b8d16b99e958cdbd92aa2e470cb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/e566070effe60b8d16b99e958cdbd92aa2e470cb", + "reference": "e566070effe60b8d16b99e958cdbd92aa2e470cb", + "shasum": "" + }, + "require": { + "php": "^7.1.3" + }, + "require-dev": { + "symfony/var-dumper": "^4.1.1|^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\VarExporter\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A blend of var_export() + serialize() to turn any serializable data structure to plain PHP code", + "homepage": "https://symfony.com", + "keywords": [ + "clone", + "construct", + "export", + "hydrate", + "instantiate", + "serialize" + ], + "time": "2019-12-01T08:39:58+00:00" + }, + { + "name": "theseer/fdomdocument", + "version": "1.6.6", + "source": { + "type": "git", + "url": "https://github.com/theseer/fDOMDocument.git", + "reference": "6e8203e40a32a9c770bcb62fe37e68b948da6dca" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/fDOMDocument/zipball/6e8203e40a32a9c770bcb62fe37e68b948da6dca", + "reference": "6e8203e40a32a9c770bcb62fe37e68b948da6dca", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "lib-libxml": "*", + "php": ">=5.3.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "lead" + } + ], + "description": "The classes contained within this repository extend the standard DOM to use exceptions at all occasions of errors instead of PHP warnings or notices. They also add various custom methods and shortcuts for convenience and to simplify the usage of DOM.", + "homepage": "https://github.com/theseer/fDOMDocument", + "time": "2017-06-30T11:53:12+00:00" + }, + { + "name": "theseer/tokenizer", + "version": "1.1.3", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "11336f6f84e16a720dae9d8e6ed5019efa85a0f9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/11336f6f84e16a720dae9d8e6ed5019efa85a0f9", + "reference": "11336f6f84e16a720dae9d8e6ed5019efa85a0f9", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^7.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + } + ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "time": "2019-06-13T22:48:21+00:00" + }, + { + "name": "webmozart/assert", + "version": "1.6.0", + "source": { + "type": "git", + "url": "https://github.com/webmozart/assert.git", + "reference": "573381c0a64f155a0d9a23f4b0c797194805b925" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozart/assert/zipball/573381c0a64f155a0d9a23f4b0c797194805b925", + "reference": "573381c0a64f155a0d9a23f4b0c797194805b925", + "shasum": "" + }, + "require": { + "php": "^5.3.3 || ^7.0", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "vimeo/psalm": "<3.6.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.36 || ^7.5.13" + }, + "type": "library", + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "time": "2019-11-24T13:36:37+00:00" + } + ], + "aliases": [], + "minimum-stability": "dev", + "stability-flags": { + "symfony/routing": 20, + "roave/security-advisories": 20 + }, + "prefer-stable": true, + "prefer-lowest": false, + "platform": [], + "platform-dev": [], + "platform-overrides": { + "php": "7.2.0" + } +} diff --git a/config/.gitkeep b/config/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/core/app/engine/.editorconfig b/core/app/engine/.editorconfig new file mode 100644 index 000000000..6e87a003d --- /dev/null +++ b/core/app/engine/.editorconfig @@ -0,0 +1,13 @@ +# Editor configuration, see http://editorconfig.org +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +max_line_length = off +trim_trailing_whitespace = false diff --git a/core/app/engine/.gitignore b/core/app/engine/.gitignore new file mode 100644 index 000000000..29e99e655 --- /dev/null +++ b/core/app/engine/.gitignore @@ -0,0 +1,56 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# compiled output +/dist +/tmp +/out-tsc +# Only exists if Bazel was run +/bazel-out + +# dependencies +/node_modules + +# profiling files +chrome-profiler-events.json +speed-measure-plugin.json + +# IDEs and editors +/.idea +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +.history/* + +# misc +*.css.map +.sass-cache +/connect.lock +/coverage +/libpeerconnection.log +npm-debug.log +yarn-error.log +testem.log +/typings + +# e2e +/e2e/*.js +/e2e/*.map + +# System Files +.DS_Store +Thumbs.db + +src/app/app-files/* +!src/app/app-files/.gitkeep +src/app/config-local.ts +/nbproject diff --git a/core/app/engine/README.md b/core/app/engine/README.md new file mode 100644 index 000000000..732b4ff1f --- /dev/null +++ b/core/app/engine/README.md @@ -0,0 +1,108 @@ +# SuiteCRM + +This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 7.3.4. + +## Development server + +Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files. + +## Code scaffolding + +Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`. + +## Build + +Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. Use the `--prod` flag for a production build. + +## Running unit tests + +Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io). + +## Running end-to-end tests + +Run `ng e2e` to execute the end-to-end tests via [Protractor](http://www.protractortest.org/). + +## Further help + +To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI README](https://github.com/angular/angular-cli/blob/master/README.md). + +# Creating in-build SVG files: + +usage of svgbuild.js: `node svgbuild.js [folder-of-svg-files] [svg-icon-template-html]` + +# Creating local config: + +Set your local specific changes in `config-local.ts`. +See more in `config-example.ts`. + +(Note: You can make more environment specific configuration and set your config class in `config-class.ts`.) + +example for `config-local.ts`: +``` +import { ConfigExample } from './config-example'; + +export class ConfigLocal extends ConfigExample { + + // add your local config overrides here.. + + constructor() { + super(); + + // override the config variables separately: + this.fakeApiUrls.fakeBaseUrl = 'http://localhost/scrm8/fakeapi.php?'; + } +} +``` +# Front End Testing + +Front end tests are created to ensure the application runs as expected from start to finish for the end user + +The Angular CLI downloads and install everything you need to test an Angular application with the Jasmine test framework + +## Running Tests + +The project you create with the CLI is immediately ready to test + +Simply run the CLI command: + +```ng test [options]``` +OR +```ng t [options]``` + +For full testing options, see: https://angular.io/cli/test#options + +### Karma configuration + +Karma is the task runner for the tests written in Jasmine + +There is a config created called karma.conf.js + +The Angular CLI configuration of Karma uses the file “test.ts” as the entry point of the tests for the application + +Within each component there is a test file where you add your unit test code + +This will normally be automatically generated by the CLI as {component-name}.spec.ts as standard + +Karma picks up files with extension '.spec.ts' as test files + +## End-To-End Testing + +In addition to running standard tests, you can run end to end tests within the Angular CLI using: + +```ng e2e [options]``` + OR +```ng e [options]``` + +For full testing options, see: https://angular.io/cli/e2e#options + +The end-to-end tests build and serve your Angular app, then run end-to-end tests using Protractor + +This allows you to run end-to-end testing from a user's perspective + +The tests ensure the application runs as expected from start to finish + +As the tests run, you will see the browser interaction just as you would see it from the user perspective + +To run the tests, Protractor depends on two files + +The spec files inside the e2e folder and the 'protractor.conf.json' file diff --git a/core/app/engine/angular.json b/core/app/engine/angular.json new file mode 100644 index 000000000..c6a59ba63 --- /dev/null +++ b/core/app/engine/angular.json @@ -0,0 +1,138 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "version": 1, + "newProjectRoot": "projects", + "projects": { + "SuiteCRM": { + "root": "", + "sourceRoot": "src", + "projectType": "application", + "prefix": "scrm", + "architect": { + "build": { + "builder": "@angular-devkit/build-angular:browser", + "options": { + "outputPath": "dist", + "index": "src/index.html", + "main": "src/main.ts", + "polyfills": "src/polyfills.ts", + "tsConfig": "src/tsconfig.app.json", + "assets": [ + "src/favicon.ico", + "src/assets" + ], + "scripts": [], + "styles": [ + "node_modules/bootstrap-css-only/css/bootstrap.min.css", + "src/assets/themes/suite8/css/style.min.css" + ] + }, + "configurations": { + "production": { + "fileReplacements": [ + { + "replace": "src/environments/environment.ts", + "with": "src/environments/environment.prod.ts" + } + ], + "optimization": true, + "outputHashing": "all", + "sourceMap": false, + "extractCss": true, + "namedChunks": false, + "aot": true, + "extractLicenses": true, + "vendorChunk": false, + "buildOptimizer": true + } + } + }, + "serve": { + "builder": "@angular-devkit/build-angular:dev-server", + "options": { + "browserTarget": "SuiteCRM:build" + }, + "configurations": { + "production": { + "browserTarget": "SuiteCRM:build:production" + } + } + }, + "extract-i18n": { + "builder": "@angular-devkit/build-angular:extract-i18n", + "options": { + "browserTarget": "SuiteCRM:build" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "src/test.ts", + "polyfills": "src/polyfills.ts", + "tsConfig": "src/tsconfig.spec.json", + "karmaConfig": "src/karma.conf.js", + "styles": [ + "node_modules/bootstrap-css-only/css/bootstrap.min.css", + "themes/suite8/css/style.min.css" + ], + "scripts": [], + "assets": [ + "src/favicon.ico", + "src/assets" + ] + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "src/tsconfig.app.json", + "src/tsconfig.spec.json" + ], + "exclude": [ + "**/node_modules/**" + ] + } + } + } + }, + "SuiteCRM-e2e": { + "root": "e2e", + "projectType": "application", + "prefix": "", + "architect": { + "e2e": { + "builder": "@angular-devkit/build-angular:protractor", + "options": { + "protractorConfig": "e2e/protractor.conf.js", + "devServerTarget": "SuiteCRM:serve" + }, + "configurations": { + "production": { + "devServerTarget": "SuiteCRM:serve:production" + } + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": "e2e/tsconfig.e2e.json", + "exclude": [ + "**/node_modules/**" + ] + } + } + } + } + }, + "defaultProject": "SuiteCRM", + "schematics": { + "@schematics/angular:component": { + "prefix": "app", + "styleext": "css" + }, + "@schematics/angular:directive": { + "prefix": "app" + } + } +} \ No newline at end of file diff --git a/core/app/engine/e2e/app.e2e-spec.ts b/core/app/engine/e2e/app.e2e-spec.ts new file mode 100644 index 000000000..785b2cec3 --- /dev/null +++ b/core/app/engine/e2e/app.e2e-spec.ts @@ -0,0 +1,14 @@ +import {AppPage} from './app.po'; + +describe('dynamic-component-loader App', () => { + let page: AppPage; + + beforeEach(() => { + page = new AppPage(); + }); + + it('should display welcome message', () => { + page.navigateTo(); + expect(page.getParagraphText()).toEqual('Welcome to app!'); + }); +}); diff --git a/core/app/engine/e2e/app.po.ts b/core/app/engine/e2e/app.po.ts new file mode 100644 index 000000000..27fb1afae --- /dev/null +++ b/core/app/engine/e2e/app.po.ts @@ -0,0 +1,11 @@ +import {browser, by, element} from 'protractor'; + +export class AppPage { + navigateTo() { + return browser.get('/'); + } + + getParagraphText() { + return element(by.css('app-root h1')).getText(); + } +} diff --git a/core/app/engine/e2e/tsconfig.e2e.json b/core/app/engine/e2e/tsconfig.e2e.json new file mode 100644 index 000000000..1d9e5edf0 --- /dev/null +++ b/core/app/engine/e2e/tsconfig.e2e.json @@ -0,0 +1,14 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "outDir": "../out-tsc/e2e", + "baseUrl": "./", + "module": "commonjs", + "target": "es5", + "types": [ + "jasmine", + "jasminewd2", + "node" + ] + } +} diff --git a/core/app/engine/package-lock.json b/core/app/engine/package-lock.json new file mode 100644 index 000000000..b2e52aed2 --- /dev/null +++ b/core/app/engine/package-lock.json @@ -0,0 +1,12059 @@ +{ + "name": "suitecrm", + "version": "0.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@angular-devkit/architect": { + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.12.4.tgz", + "integrity": "sha512-19f3jbGyP+GzTSBgrHR4SWGK81SUgtTxhkAcyhmsIEDuXrMJM8kPu0HB9WivJ5p08+jzwz6xdF9mpNYSeD9uqw==", + "dev": true, + "requires": { + "@angular-devkit/core": "7.2.4", + "rxjs": "6.3.3" + }, + "dependencies": { + "rxjs": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz", + "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + } + } + }, + "@angular-devkit/build-angular": { + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.12.4.tgz", + "integrity": "sha512-zzjpM9GpCGEUtTPv/T04CALzFXkTgAAiNt1whY1Vmtu2YYUksXOm1ysA2RBLEhb81RodTEwVV2zFUj5v2xHYEw==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.12.4", + "@angular-devkit/build-optimizer": "0.12.4", + "@angular-devkit/build-webpack": "0.12.4", + "@angular-devkit/core": "7.2.4", + "@ngtools/webpack": "7.2.4", + "ajv": "6.6.2", + "autoprefixer": "9.4.3", + "circular-dependency-plugin": "5.0.2", + "clean-css": "4.2.1", + "copy-webpack-plugin": "4.6.0", + "file-loader": "2.0.0", + "glob": "7.1.3", + "istanbul": "0.4.5", + "istanbul-instrumenter-loader": "3.0.1", + "karma-source-map-support": "1.3.0", + "less": "3.9.0", + "less-loader": "4.1.0", + "license-webpack-plugin": "2.0.4", + "loader-utils": "1.1.0", + "mini-css-extract-plugin": "0.4.4", + "minimatch": "3.0.4", + "node-sass": "4.10.0", + "opn": "5.4.0", + "parse5": "4.0.0", + "portfinder": "1.0.17", + "postcss": "7.0.13", + "postcss-import": "12.0.1", + "postcss-loader": "3.0.0", + "raw-loader": "0.5.1", + "rxjs": "6.3.3", + "sass-loader": "7.1.0", + "semver": "5.5.1", + "source-map-loader": "0.2.4", + "source-map-support": "0.5.9", + "speed-measure-webpack-plugin": "1.2.5", + "stats-webpack-plugin": "0.7.0", + "style-loader": "0.23.1", + "stylus": "0.54.5", + "stylus-loader": "3.0.2", + "terser-webpack-plugin": "1.2.1", + "tree-kill": "1.2.0", + "webpack": "4.28.4", + "webpack-dev-middleware": "3.4.0", + "webpack-dev-server": "3.1.14", + "webpack-merge": "4.1.4", + "webpack-sources": "1.3.0", + "webpack-subresource-integrity": "1.1.0-rc.6" + }, + "dependencies": { + "ajv": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.6.2.tgz", + "integrity": "sha512-FBHEW6Jf5TB9MGBgUUA9XHkTbjXYfAUjY43ACMfmdMRHniyoMHjHjzD50OK8LGDWQwp4rWEsIq5kEqq7rvIM1g==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "parse5": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", + "dev": true + }, + "rxjs": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz", + "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "semver": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz", + "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==", + "dev": true + } + } + }, + "@angular-devkit/build-optimizer": { + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.12.4.tgz", + "integrity": "sha512-KraU+ZARX7JMtttPjOku9wVF+dnjMsIbiIVsQrNXhpFiGT1fSJhQTPxc98ONgEmUiGROFXXq2mHLilvMr2WdwQ==", + "dev": true, + "requires": { + "loader-utils": "1.1.0", + "source-map": "0.5.6", + "typescript": "3.2.4", + "webpack-sources": "1.2.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "dev": true + }, + "webpack-sources": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.2.0.tgz", + "integrity": "sha512-9BZwxR85dNsjWz3blyxdOhTgtnQvv3OEs5xofI0wPYTwu5kaWxS08UuD1oI7WLBLpRO+ylf0ofnXLXWmGb2WMw==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + } + } + }, + "@angular-devkit/build-webpack": { + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.12.4.tgz", + "integrity": "sha512-1+t2MUB+dq+1LbfTnvzZwj2QTWiugyMywXqYjsyt0rrh7VcriD1lQ+P5yN8kgFz/R7Ut4LgvS05yDX1JHi20qw==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.12.4", + "@angular-devkit/core": "7.2.4", + "rxjs": "6.3.3" + }, + "dependencies": { + "rxjs": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz", + "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + } + } + }, + "@angular-devkit/core": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-7.2.4.tgz", + "integrity": "sha512-XHF59tIHg2qEM1Wd415xhykBLjjfOK6yMB7CjNk1bToUMX2QDT87izJF4y1Vwa0lIw9G0jdgP/4/M/OqXcbYmA==", + "dev": true, + "requires": { + "ajv": "6.6.2", + "chokidar": "2.0.4", + "fast-json-stable-stringify": "2.0.0", + "rxjs": "6.3.3", + "source-map": "0.7.3" + }, + "dependencies": { + "ajv": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.6.2.tgz", + "integrity": "sha512-FBHEW6Jf5TB9MGBgUUA9XHkTbjXYfAUjY43ACMfmdMRHniyoMHjHjzD50OK8LGDWQwp4rWEsIq5kEqq7rvIM1g==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "rxjs": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz", + "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } + } + }, + "@angular-devkit/schematics": { + "version": "7.3.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-7.3.9.tgz", + "integrity": "sha512-xzROGCYp7aQbeJ3V6YC0MND7wKEAdWqmm/GaCufEk0dDS8ZGe0sQhcM2oBRa2nQqGQNeThFIH51kx+FayrJP0w==", + "dev": true, + "requires": { + "@angular-devkit/core": "7.3.9", + "rxjs": "6.3.3" + }, + "dependencies": { + "@angular-devkit/core": { + "version": "7.3.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-7.3.9.tgz", + "integrity": "sha512-SaxD+nKFW3iCBKsxNR7+66J30EexW/y7tm8m5AvUH+GwSAgIj0ZYmRUzFEPggcaLVA4WnE/YWqIXZMJW5dT7gw==", + "dev": true, + "requires": { + "ajv": "6.9.1", + "chokidar": "2.0.4", + "fast-json-stable-stringify": "2.0.0", + "rxjs": "6.3.3", + "source-map": "0.7.3" + } + }, + "ajv": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.9.1.tgz", + "integrity": "sha512-XDN92U311aINL77ieWHmqCcNlwjoP5cHXDxIxbf2MaPYuCXOHS7gHH8jktxeK5omgd52XbSTX6a4Piwd1pQmzA==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "rxjs": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz", + "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } + } + }, + "@angular/animations": { + "version": "7.2.15", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-7.2.15.tgz", + "integrity": "sha512-8oBt3HLgd2+kyJHUgsd7OzKCCss67t2sch15XNoIWlOLfxclqU+EfFE6t/vCzpT8/+lpZS6LU9ZrTnb+UBj5jg==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/cdk": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-7.3.7.tgz", + "integrity": "sha512-xbXxhHHKGkVuW6K7pzPmvpJXIwpl0ykBnvA2g+/7Sgy5Pd35wCC+UtHD9RYczDM/mkygNxMQtagyCErwFnDtQA==", + "requires": { + "parse5": "^5.0.0", + "tslib": "^1.7.1" + } + }, + "@angular/cli": { + "version": "7.3.9", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-7.3.9.tgz", + "integrity": "sha512-7oJj7CKDlFUbQav1x1CV4xKKcbt0pnxY4unKcm7Q1tVXhu8bU2bc3cDA0aJnbofcYb6TJcd/C2qHgCt78q7edA==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.13.9", + "@angular-devkit/core": "7.3.9", + "@angular-devkit/schematics": "7.3.9", + "@schematics/angular": "7.3.9", + "@schematics/update": "0.13.9", + "@yarnpkg/lockfile": "1.1.0", + "ini": "1.3.5", + "inquirer": "6.2.1", + "npm-package-arg": "6.1.0", + "open": "6.0.0", + "pacote": "9.4.0", + "semver": "5.6.0", + "symbol-observable": "1.2.0" + }, + "dependencies": { + "@angular-devkit/architect": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.13.9.tgz", + "integrity": "sha512-EAFtCs9dsGhpMRC45PoYsrkiExpWz9Ax15qXfzwdDRacz5DmdOVt+QpkLW1beUOwiyj/bhFyj23eaONK2RTn/w==", + "dev": true, + "requires": { + "@angular-devkit/core": "7.3.9", + "rxjs": "6.3.3" + } + }, + "@angular-devkit/core": { + "version": "7.3.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-7.3.9.tgz", + "integrity": "sha512-SaxD+nKFW3iCBKsxNR7+66J30EexW/y7tm8m5AvUH+GwSAgIj0ZYmRUzFEPggcaLVA4WnE/YWqIXZMJW5dT7gw==", + "dev": true, + "requires": { + "ajv": "6.9.1", + "chokidar": "2.0.4", + "fast-json-stable-stringify": "2.0.0", + "rxjs": "6.3.3", + "source-map": "0.7.3" + } + }, + "ajv": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.9.1.tgz", + "integrity": "sha512-XDN92U311aINL77ieWHmqCcNlwjoP5cHXDxIxbf2MaPYuCXOHS7gHH8jktxeK5omgd52XbSTX6a4Piwd1pQmzA==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "rxjs": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz", + "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "semver": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "dev": true + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } + } + }, + "@angular/common": { + "version": "7.2.15", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-7.2.15.tgz", + "integrity": "sha512-2b5JY2HWVHCf3D1GZjmde7jdAXSTXkYtmjLtA9tQkjOOTr80eHpNSujQqnzb97dk9VT9OjfjqTQd7K3pxZz8jw==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/compiler": { + "version": "7.2.15", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-7.2.15.tgz", + "integrity": "sha512-5yb4NcLk8GuXkYf7Dcor4XkGueYp4dgihzDmMjYDUrV0NPhubKlr+SwGtLOtzgRBWJ1I2bO0S3zwa0q0OgIPOw==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/compiler-cli": { + "version": "7.2.15", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-7.2.15.tgz", + "integrity": "sha512-+AsfyKawmj/sa+m4Pz8VSRFbCfx/3IOjAuuEjhopbyr154YpPDSu8NTbcwzq3yfbVcPwK4/4exmbQzpsndaCTg==", + "dev": true, + "requires": { + "canonical-path": "1.0.0", + "chokidar": "^2.1.1", + "convert-source-map": "^1.5.1", + "dependency-graph": "^0.7.2", + "magic-string": "^0.25.0", + "minimist": "^1.2.0", + "reflect-metadata": "^0.1.2", + "shelljs": "^0.8.1", + "source-map": "^0.6.1", + "tslib": "^1.9.0", + "yargs": "9.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "dev": true, + "requires": { + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + } + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yargs": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-9.0.1.tgz", + "integrity": "sha1-UqzCP+7Kw0BCB47njAwAf1CF20w=", + "dev": true, + "requires": { + "camelcase": "^4.1.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "read-pkg-up": "^2.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", + "yargs-parser": "^7.0.0" + } + }, + "yargs-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", + "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", + "dev": true, + "requires": { + "camelcase": "^4.1.0" + } + } + } + }, + "@angular/core": { + "version": "7.2.15", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-7.2.15.tgz", + "integrity": "sha512-XsuYm0jEU/mOqwDOk2utThv8J9kESkAerfuCHClE9rB2TtHUOGCfekF7lJWqjjypu6/J9ygoPFo7hdAE058ZGg==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/forms": { + "version": "7.2.15", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-7.2.15.tgz", + "integrity": "sha512-p0kcIQLtBBC1qeTA6M3nOuXf/k91E80FKquVM9zEsO2kDjI0oZJVfFYL2UMov5samlJOPN+t6lRHEIUa7ApPsw==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/http": { + "version": "7.2.15", + "resolved": "https://registry.npmjs.org/@angular/http/-/http-7.2.15.tgz", + "integrity": "sha512-TR7PEdmLWNIre3Zn8lvyb4lSrvPUJhKLystLnp4hBMcWsJqq5iK8S3bnlR4viZ9HMlf7bW7+Hm4SI6aB3tdUtw==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/language-service": { + "version": "7.2.15", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-7.2.15.tgz", + "integrity": "sha512-Ig5Jr7mnDelaZvSbUd9YhI5am3q1ku9xelAuwvtyDKvQJeKQj3BtTagcOgWrnQBfrJ/FsA/M5Zo48ncSsV0tqQ==", + "dev": true + }, + "@angular/material": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-7.3.7.tgz", + "integrity": "sha512-Eq+7frkeNGkLOfEtmkmJgR+AgoWajOipXZWWfCSamNfpCcPof82DwvGOpAmgGni9FuN2XFQdqP5MoaffQzIvUA==", + "requires": { + "tslib": "^1.7.1" + } + }, + "@angular/platform-browser": { + "version": "7.2.15", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-7.2.15.tgz", + "integrity": "sha512-aYgmPsbC9Tvp9vmKWD8voeAp4crwCay7/D6lM3ClEe2EeK934LuEXq3/uczMrFVbnIX7BBIo8fh03Tl7wbiGPw==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/platform-browser-dynamic": { + "version": "7.2.15", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-7.2.15.tgz", + "integrity": "sha512-UL2PqhzXMD769NQ6Lh6pxlBDKvN9Qol3XLRFil80lwJ1GRW16ITeYbCamcafIH2GOyd88IhmYcbMfUQ/6q4MMQ==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/router": { + "version": "7.2.15", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-7.2.15.tgz", + "integrity": "sha512-qAubRJRQanguUqJQ76J9GSZ4JFtoyhJKRmX5P23ANZJXpB6YLzF2fJmOGi+E6cV8F0tKBMEq1pjxFTisx0MXwQ==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/generator": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.4.tgz", + "integrity": "sha512-m5qo2WgdOJeyYngKImbkyQrnUN1mPceaG5BV+G0E3gWsa4l/jCSryWJdM2x8OuGAOyh+3d5pVYfZWCiNFtynxg==", + "requires": { + "@babel/types": "^7.7.4", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz", + "integrity": "sha512-AnkGIdiBhEuiwdoMnKm7jfPfqItZhgRaZfMg1XX3bS25INOnLPjPG1Ppnajh8eqgt5kPJnfqrRHqFqmjKDZLzQ==", + "requires": { + "@babel/helper-get-function-arity": "^7.7.4", + "@babel/template": "^7.7.4", + "@babel/types": "^7.7.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz", + "integrity": "sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA==", + "requires": { + "@babel/types": "^7.7.4" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.4.tgz", + "integrity": "sha512-guAg1SXFcVr04Guk9eq0S4/rWS++sbmyqosJzVs8+1fH5NI+ZcmkaSkc7dmtAFbHFva6yRJnjW3yAcGxjueDug==", + "requires": { + "@babel/types": "^7.7.4" + } + }, + "@babel/highlight": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.4.tgz", + "integrity": "sha512-jIwvLO0zCL+O/LmEJQjWA75MQTWwx3c3u2JOTDK5D3/9egrWRRA0/0hk9XXywYnXZVVpzrBYeIQTmhwUaePI9g==" + }, + "@babel/template": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.4.tgz", + "integrity": "sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw==", + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.4", + "@babel/types": "^7.7.4" + } + }, + "@babel/traverse": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.7.4.tgz", + "integrity": "sha512-P1L58hQyupn8+ezVA2z5KBm4/Zr4lCC8dwKCMYzsa5jFMDMQAzaBNy9W5VjB+KAmBjb40U7a/H6ao+Xo+9saIw==", + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.7.4", + "@babel/helper-function-name": "^7.7.4", + "@babel/helper-split-export-declaration": "^7.7.4", + "@babel/parser": "^7.7.4", + "@babel/types": "^7.7.4", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", + "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "@ng-bootstrap/ng-bootstrap": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@ng-bootstrap/ng-bootstrap/-/ng-bootstrap-4.2.2.tgz", + "integrity": "sha512-v8QmC17bv9he5Ep6zutaI9aQ2w/2NqySP0fejOKe7cacKpGUqsLIakpyd2FD7mfZu7pSCCtHYpRWR+h6yq+Ngg==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@ngtools/webpack": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-7.2.4.tgz", + "integrity": "sha512-mXMDODmy53kk+Kb5jgLNQOsSrDBQQMf6C6KZNuGo8AdvUGdGaQeZDze4o7bcUz1KUjuaaP1Zh7pZtho8C4/T+Q==", + "dev": true, + "requires": { + "@angular-devkit/core": "7.2.4", + "enhanced-resolve": "4.1.0", + "rxjs": "6.3.3", + "tree-kill": "1.2.0", + "webpack-sources": "1.2.0" + }, + "dependencies": { + "rxjs": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz", + "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "webpack-sources": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.2.0.tgz", + "integrity": "sha512-9BZwxR85dNsjWz3blyxdOhTgtnQvv3OEs5xofI0wPYTwu5kaWxS08UuD1oI7WLBLpRO+ylf0ofnXLXWmGb2WMw==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + } + } + }, + "@schematics/angular": { + "version": "7.3.9", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-7.3.9.tgz", + "integrity": "sha512-B3lytFtFeYNLfWdlrIzvy3ulFRccD2/zkoL0734J+DAGfUz7vbysJ50RwYL46sQUcKdZdvb48ktfu1S8yooP6Q==", + "dev": true, + "requires": { + "@angular-devkit/core": "7.3.9", + "@angular-devkit/schematics": "7.3.9", + "typescript": "3.2.4" + }, + "dependencies": { + "@angular-devkit/core": { + "version": "7.3.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-7.3.9.tgz", + "integrity": "sha512-SaxD+nKFW3iCBKsxNR7+66J30EexW/y7tm8m5AvUH+GwSAgIj0ZYmRUzFEPggcaLVA4WnE/YWqIXZMJW5dT7gw==", + "dev": true, + "requires": { + "ajv": "6.9.1", + "chokidar": "2.0.4", + "fast-json-stable-stringify": "2.0.0", + "rxjs": "6.3.3", + "source-map": "0.7.3" + } + }, + "ajv": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.9.1.tgz", + "integrity": "sha512-XDN92U311aINL77ieWHmqCcNlwjoP5cHXDxIxbf2MaPYuCXOHS7gHH8jktxeK5omgd52XbSTX6a4Piwd1pQmzA==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "rxjs": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz", + "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } + } + }, + "@schematics/update": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.13.9.tgz", + "integrity": "sha512-4MQcaKFxhMzZyE//+DknDh3h3duy3avg2oxSHxdwXlCZ8Q92+4lpegjJcSRiqlEwO4qeJ5XnrjrvzfIiaIZOmA==", + "dev": true, + "requires": { + "@angular-devkit/core": "7.3.9", + "@angular-devkit/schematics": "7.3.9", + "@yarnpkg/lockfile": "1.1.0", + "ini": "1.3.5", + "pacote": "9.4.0", + "rxjs": "6.3.3", + "semver": "5.6.0", + "semver-intersect": "1.4.0" + }, + "dependencies": { + "@angular-devkit/core": { + "version": "7.3.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-7.3.9.tgz", + "integrity": "sha512-SaxD+nKFW3iCBKsxNR7+66J30EexW/y7tm8m5AvUH+GwSAgIj0ZYmRUzFEPggcaLVA4WnE/YWqIXZMJW5dT7gw==", + "dev": true, + "requires": { + "ajv": "6.9.1", + "chokidar": "2.0.4", + "fast-json-stable-stringify": "2.0.0", + "rxjs": "6.3.3", + "source-map": "0.7.3" + } + }, + "ajv": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.9.1.tgz", + "integrity": "sha512-XDN92U311aINL77ieWHmqCcNlwjoP5cHXDxIxbf2MaPYuCXOHS7gHH8jktxeK5omgd52XbSTX6a4Piwd1pQmzA==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "rxjs": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz", + "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "semver": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "dev": true + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } + } + }, + "@types/chart.js": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/@types/chart.js/-/chart.js-2.9.3.tgz", + "integrity": "sha512-R5F39GIQ54fZJ04pmgbLrx0/dOEhyS8LRQNdlAmZd5zWZiFJ0v9zNNSBJ9WOTBRrMjeV53s0qhnRRvhcs6dfyQ==" + }, + "@types/jasmine": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.5.0.tgz", + "integrity": "sha512-kGCRI9oiCxFS6soGKlyzhMzDydfcPix9PpTkr7h11huxOxhWwP37Tg7DYBaQ18eQTNreZEuLkhpbGSqVNZPnnw==", + "dev": true + }, + "@types/jasminewd2": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@types/jasminewd2/-/jasminewd2-2.0.8.tgz", + "integrity": "sha512-d9p31r7Nxk0ZH0U39PTH0hiDlJ+qNVGjlt1ucOoTUptxb2v+Y5VMnsxfwN+i3hK4yQnqBi3FMmoMFcd1JHDxdg==", + "dev": true, + "requires": { + "@types/jasmine": "*" + } + }, + "@types/node": { + "version": "10.17.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.6.tgz", + "integrity": "sha512-0a2X6cgN3RdPBL2MIlR6Lt0KlM7fOFsutuXcdglcOq6WvLnYXgPQSh0Mx6tO1KCAE8MxbHSOSTWDoUxRq+l3DA==" + }, + "@types/object-hash": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@types/object-hash/-/object-hash-1.3.0.tgz", + "integrity": "sha512-il4NIe4jTx4lfhkKaksmmGHw5EsVkO8sHWkpJHM9m59r1dtsVadLSrJqdE8zU74NENDAsR3oLIOlooRAXlPLNA==", + "requires": { + "@types/node": "*" + } + }, + "@types/q": { + "version": "0.0.32", + "resolved": "https://registry.npmjs.org/@types/q/-/q-0.0.32.tgz", + "integrity": "sha1-vShOV8hPEyXacCur/IKlMoGQwMU=", + "dev": true + }, + "@types/selenium-webdriver": { + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-3.0.16.tgz", + "integrity": "sha512-lMC2G0ItF2xv4UCiwbJGbnJlIuUixHrioOhNGHSCsYCJ8l4t9hMCUimCytvFv7qy6AfSzRxhRHoGa+UqaqwyeA==", + "dev": true + }, + "@types/source-list-map": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", + "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==", + "dev": true + }, + "@types/webpack-sources": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-0.1.5.tgz", + "integrity": "sha512-zfvjpp7jiafSmrzJ2/i3LqOyTYTuJ7u1KOXlKgDlvsj9Rr0x7ZiYu5lZbXwobL7lmsRNtPXlBfmaUD8eU2Hu8w==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/source-list-map": "*", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "@webassemblyjs/ast": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.7.11.tgz", + "integrity": "sha512-ZEzy4vjvTzScC+SH8RBssQUawpaInUdMTYwYYLh54/s8TuT0gBLuyUnppKsVyZEi876VmmStKsUs28UxPgdvrA==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/wast-parser": "1.7.11" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.11.tgz", + "integrity": "sha512-zY8dSNyYcgzNRNT666/zOoAyImshm3ycKdoLsyDw/Bwo6+/uktb7p4xyApuef1dwEBo/U/SYQzbGBvV+nru2Xg==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.11.tgz", + "integrity": "sha512-7r1qXLmiglC+wPNkGuXCvkmalyEstKVwcueZRP2GNC2PAvxbLYwLLPr14rcdJaE4UtHxQKfFkuDFuv91ipqvXg==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.11.tgz", + "integrity": "sha512-MynuervdylPPh3ix+mKZloTcL06P8tenNH3sx6s0qE8SLR6DdwnfgA7Hc9NSYeob2jrW5Vql6GVlsQzKQCa13w==", + "dev": true + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.11.tgz", + "integrity": "sha512-T8ESC9KMXFTXA5urJcyor5cn6qWeZ4/zLPyWeEXZ03hj/x9weSokGNkVCdnhSabKGYWxElSdgJ+sFa9G/RdHNw==", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.7.11" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.11.tgz", + "integrity": "sha512-nsAQWNP1+8Z6tkzdYlXT0kxfa2Z1tRTARd8wYnc/e3Zv3VydVVnaeePgqUzFrpkGUyhUUxOl5ML7f1NuT+gC0A==", + "dev": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.11.tgz", + "integrity": "sha512-JxfD5DX8Ygq4PvXDucq0M+sbUFA7BJAv/GGl9ITovqE+idGX+J3QSzJYz+LwQmL7fC3Rs+utvWoJxDb6pmC0qg==", + "dev": true + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.11.tgz", + "integrity": "sha512-cMXeVS9rhoXsI9LLL4tJxBgVD/KMOKXuFqYb5oCJ/opScWpkCMEz9EJtkonaNcnLv2R3K5jIeS4TRj/drde1JQ==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.11.tgz", + "integrity": "sha512-8ZRY5iZbZdtNFE5UFunB8mmBEAbSI3guwbrsCl4fWdfRiAcvqQpeqd5KHhSWLL5wuxo53zcaGZDBU64qgn4I4Q==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-buffer": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/wasm-gen": "1.7.11" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.7.11.tgz", + "integrity": "sha512-Mmqx/cS68K1tSrvRLtaV/Lp3NZWzXtOHUW2IvDvl2sihAwJh4ACE0eL6A8FvMyDG9abes3saB6dMimLOs+HMoQ==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.7.11.tgz", + "integrity": "sha512-vuGmgZjjp3zjcerQg+JA+tGOncOnJLWVkt8Aze5eWQLwTQGNgVLcyOTqgSCxWTR4J42ijHbBxnuRaL1Rv7XMdw==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.1" + } + }, + "@webassemblyjs/utf8": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.7.11.tgz", + "integrity": "sha512-C6GFkc7aErQIAH+BMrIdVSmW+6HSe20wg57HEC1uqJP8E/xpMjXqQUxkQw07MhNDSDcGpxI9G5JSNOQCqJk4sA==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.11.tgz", + "integrity": "sha512-FUd97guNGsCZQgeTPKdgxJhBXkUbMTY6hFPf2Y4OedXd48H97J+sOY2Ltaq6WGVpIH8o/TGOVNiVz/SbpEMJGg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-buffer": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/helper-wasm-section": "1.7.11", + "@webassemblyjs/wasm-gen": "1.7.11", + "@webassemblyjs/wasm-opt": "1.7.11", + "@webassemblyjs/wasm-parser": "1.7.11", + "@webassemblyjs/wast-printer": "1.7.11" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.11.tgz", + "integrity": "sha512-U/KDYp7fgAZX5KPfq4NOupK/BmhDc5Kjy2GIqstMhvvdJRcER/kUsMThpWeRP8BMn4LXaKhSTggIJPOeYHwISA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/ieee754": "1.7.11", + "@webassemblyjs/leb128": "1.7.11", + "@webassemblyjs/utf8": "1.7.11" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.11.tgz", + "integrity": "sha512-XynkOwQyiRidh0GLua7SkeHvAPXQV/RxsUeERILmAInZegApOUAIJfRuPYe2F7RcjOC9tW3Cb9juPvAC/sCqvg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-buffer": "1.7.11", + "@webassemblyjs/wasm-gen": "1.7.11", + "@webassemblyjs/wasm-parser": "1.7.11" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.11.tgz", + "integrity": "sha512-6lmXRTrrZjYD8Ng8xRyvyXQJYUQKYSXhJqXOBLw24rdiXsHAOlvw5PhesjdcaMadU/pyPQOJ5dHreMjBxwnQKg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-api-error": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/ieee754": "1.7.11", + "@webassemblyjs/leb128": "1.7.11", + "@webassemblyjs/utf8": "1.7.11" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.7.11.tgz", + "integrity": "sha512-lEyVCg2np15tS+dm7+JJTNhNWq9yTZvi3qEhAIIOaofcYlUp0UR5/tVqOwa/gXYr3gjwSZqw+/lS9dscyLelbQ==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/floating-point-hex-parser": "1.7.11", + "@webassemblyjs/helper-api-error": "1.7.11", + "@webassemblyjs/helper-code-frame": "1.7.11", + "@webassemblyjs/helper-fsm": "1.7.11", + "@xtuc/long": "4.2.1" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.7.11.tgz", + "integrity": "sha512-m5vkAsuJ32QpkdkDOUPGSltrg8Cuk3KBx4YrmAGQwCZPRdUHXxG4phIOuuycLemHFr74sWL9Wthqss4fzdzSwg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/wast-parser": "1.7.11", + "@xtuc/long": "4.2.1" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.1.tgz", + "integrity": "sha512-FZdkNBDqBRHKQ2MEbSC17xnPFOhZxeJ2YGSfr2BKf3sujG49Qe3bB+rGCwQfIaA7WHnGeGkSijX4FuBCdrzW/g==", + "dev": true + }, + "@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true + }, + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, + "abbrev": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", + "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", + "dev": true + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dev": true, + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", + "dev": true + }, + "acorn-dynamic-import": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz", + "integrity": "sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg==", + "dev": true, + "requires": { + "acorn": "^5.0.0" + } + }, + "adm-zip": { + "version": "0.4.13", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.13.tgz", + "integrity": "sha512-fERNJX8sOXfel6qCBCMPvZLzENBEhZTzKqg6vrOW5pvoEaQuJhRU4ndTAh6lHOxn1I6jnz2NHra56ZODM751uw==", + "dev": true + }, + "after": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", + "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", + "dev": true + }, + "agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "dev": true, + "requires": { + "es6-promisify": "^5.0.0" + } + }, + "agentkeepalive": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.2.tgz", + "integrity": "sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==", + "dev": true, + "requires": { + "humanize-ms": "^1.2.1" + } + }, + "ajv": { + "version": "6.9.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.9.2.tgz", + "integrity": "sha512-4UFy0/LgDo7Oa/+wOAlj44tp9K78u38E5/359eSrqEp1Z5PdVfimCcs7SluXMP755RUQu6d2b4AvF0R1C9RZjg==", + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "dev": true + }, + "ajv-keywords": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", + "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", + "dev": true + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true + }, + "ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "dev": true + }, + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true + }, + "ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "dev": true + }, + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "app-root-path": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-2.2.1.tgz", + "integrity": "sha512-91IFKeKk7FjfmezPKkwtaRvSpnUc4gDwPAjA1YZ9Gn0q0PPeW+vbeUsZuyDwjI7+QTHhcLen2v25fi/AmhvbJA==", + "dev": true + }, + "append-transform": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", + "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", + "requires": { + "default-require-extensions": "^2.0.0" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=" + }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "arg": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.2.tgz", + "integrity": "sha512-+ytCkGcBtHZ3V2r2Z06AncYO8jz46UEamcspGoU8lHcEbpn6J77QK0vdWvChsclg/tM5XIJC5tnjmPp7Eq6Obg==", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true, + "optional": true + }, + "array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "arraybuffer.slice": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", + "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", + "dev": true, + "optional": true + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dev": true, + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true + }, + "async-foreach": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", + "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=", + "dev": true, + "optional": true + }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "autoprefixer": { + "version": "9.4.3", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.4.3.tgz", + "integrity": "sha512-/XSnzDepRkAU//xLcXA/lUWxpsBuw0WiriAHOqnxkuCtzLhaz+fL4it4gp20BQ8n5SyLzK/FOc7A0+u/rti2FQ==", + "dev": true, + "requires": { + "browserslist": "^4.3.6", + "caniuse-lite": "^1.0.30000921", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.6", + "postcss-value-parser": "^3.3.1" + } + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.0.tgz", + "integrity": "sha512-Uvq6hVe90D0B2WEnUqtdgY1bATGz3mw33nH9Y+dmA+w5DHvUmBgkr5rM/KCHpCsiFNRUfokW/szpPPgMK2hm4A==", + "dev": true + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "babel-generator": { + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true + } + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + }, + "dependencies": { + "core-js": { + "version": "2.6.10", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.10.tgz", + "integrity": "sha512-I39t74+4t+zau64EN1fE5v2W31Adtc/REhzWN+gWRRXg6WH5qAsZm62DHpQ1+Yhe4047T55jvzz7MUqF/dBBlA==", + "dev": true + } + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "dev": true, + "requires": { + "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": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + }, + "dependencies": { + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + } + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + }, + "backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base64-arraybuffer": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", + "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", + "dev": true + }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", + "dev": true + }, + "base64id": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", + "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=", + "dev": true + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "better-assert": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", + "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", + "dev": true, + "requires": { + "callsite": "1.0.0" + } + }, + "big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "dev": true + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "blob": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", + "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==", + "dev": true + }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "dev": true, + "optional": true, + "requires": { + "inherits": "~2.0.0" + } + }, + "blocking-proxy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/blocking-proxy/-/blocking-proxy-1.0.1.tgz", + "integrity": "sha512-KE8NFMZr3mN2E0HcvCgRtX7DjhiIQrwle+nSVJVC/yqFb9+xznHl2ZcoBp2L9qzkI4t4cBFJ1efXF8Dwi132RA==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + } + } + }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dev": true, + "requires": { + "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" + } + }, + "bootstrap-css-only": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/bootstrap-css-only/-/bootstrap-css-only-4.3.1.tgz", + "integrity": "sha512-xPQNmTR6skX7boM3Q/K2vWDL8RFhfHm5PbTcn/vd7nZtkzg9tc6ScNreIIsMaP9QLUxeqvUx+OGnDaiK4KBRiQ==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "requires": { + "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": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "dev": true, + "requires": { + "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-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.8.0.tgz", + "integrity": "sha512-HYnxc/oLRWvJ3TsGegR0SRL/UDnknGq2s/a8dYYEO+kOQ9m9apKoS5oiathLKZdh/e9uE+/J3j92qPlGD/vTqA==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001012", + "electron-to-chromium": "^1.3.317", + "node-releases": "^1.1.41" + } + }, + "browserstack": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.5.3.tgz", + "integrity": "sha512-AO+mECXsW4QcqC9bxwM29O7qWa7bJT94uBFzeb5brylIQwawuEziwq20dPYbins95GlWzOawgyDNdjYAo32EKg==", + "dev": true, + "requires": { + "https-proxy-agent": "^2.2.1" + } + }, + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "dev": true, + "requires": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", + "dev": true + }, + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", + "dev": true + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "builtins": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", + "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=", + "dev": true + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true + }, + "cacache": { + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz", + "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==", + "dev": true, + "requires": { + "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" + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "caching-transform": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-3.0.2.tgz", + "integrity": "sha512-Mtgcv3lh3U0zRii/6qVgQODdPA4G3zhG+jtbCWj39RXuUFTMzH0vcdMtaJS1jPowd+It2Pqr6y3NJMQqOqCE2w==", + "requires": { + "hasha": "^3.0.0", + "make-dir": "^2.0.0", + "package-hash": "^3.0.0", + "write-file-atomic": "^2.4.2" + } + }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "dev": true, + "requires": { + "callsites": "^2.0.0" + } + }, + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "dev": true, + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", + "dev": true + }, + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "optional": true, + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true, + "optional": true + } + } + }, + "caniuse-lite": { + "version": "1.0.30001013", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001013.tgz", + "integrity": "sha512-hOAXaWKuq/UVFgYawxIOdPdyMQdYcwOCDOjnZcKn7wCgFUrhP7smuNZjGLuJlPSgE6aRA4cRJ+bGSrhtEt7ZAg==", + "dev": true + }, + "canonical-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/canonical-path/-/canonical-path-1.0.0.tgz", + "integrity": "sha512-feylzsbDxi1gPZ1IjystzIQZagYYLvfKrSuygUCgf7z6x790VEzze5QEkdSV1U58RA7Hi0+v6fv4K54atOzATg==", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "chart.js": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-2.9.3.tgz", + "integrity": "sha512-+2jlOobSk52c1VU6fzkh3UwqHMdSlgH1xFv9FKMqHiNCpXsGPQa/+81AFa+i3jZ253Mq9aAycPwDjnn1XbRNNw==", + "requires": { + "chartjs-color": "^2.1.0", + "moment": "^2.10.2" + } + }, + "chartjs-color": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chartjs-color/-/chartjs-color-2.4.1.tgz", + "integrity": "sha512-haqOg1+Yebys/Ts/9bLo/BqUcONQOdr/hoEr2LLTRl6C5LXctUdHxsCYfvQVg5JIxITrfCNUDr4ntqmQk9+/0w==", + "requires": { + "chartjs-color-string": "^0.6.0", + "color-convert": "^1.9.3" + } + }, + "chartjs-color-string": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/chartjs-color-string/-/chartjs-color-string-0.6.0.tgz", + "integrity": "sha512-TIB5OKn1hPJvO7JcteW4WY/63v6KwEdt6udfnDE9iCAZgy+V4SrbSxoIbTw/xkUIapjEI4ExGtD0+6D3KyFd7A==", + "requires": { + "color-name": "^1.0.0" + } + }, + "chartjs-plugin-annotation": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/chartjs-plugin-annotation/-/chartjs-plugin-annotation-0.5.7.tgz", + "integrity": "sha1-G/DjAZmmqf+Yic4PN6HnVagNEL8=", + "requires": { + "chart.js": "^2.4.0" + } + }, + "chokidar": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz", + "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.0", + "braces": "^2.3.0", + "fsevents": "^1.2.2", + "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" + } + }, + "chownr": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.3.tgz", + "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==", + "dev": true + }, + "chrome-trace-event": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", + "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "circular-dependency-plugin": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/circular-dependency-plugin/-/circular-dependency-plugin-5.0.2.tgz", + "integrity": "sha512-oC7/DVAyfcY3UWKm0sN/oVoDedQDQiw/vIiAnuTWTpE5s0zWf7l3WY417Xw/Fbi/QbAjctAkxgMiS9P0s3zkmA==", + "dev": true + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "clean-css": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz", + "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==", + "dev": true, + "requires": { + "source-map": "~0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true + }, + "clone-deep": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-2.0.2.tgz", + "integrity": "sha512-SZegPTKjCgpQH63E+eN6mVEEPdQBOUzjyJm5Pora4lrwWRFS8I0QAxV/KD6vV/i0WuijHZWQC1fMsPEdxfdVCQ==", + "dev": true, + "requires": { + "for-own": "^1.0.0", + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.0", + "shallow-clone": "^1.0.0" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "codelyzer": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-4.5.0.tgz", + "integrity": "sha512-oO6vCkjqsVrEsmh58oNlnJkRXuA30hF8cdNAQV9DytEalDwyOFRvHMnlKFzmOStNerOmPGZU9GAHnBo4tGvtiQ==", + "dev": true, + "requires": { + "app-root-path": "^2.1.0", + "css-selector-tokenizer": "^0.7.0", + "cssauron": "^1.4.0", + "semver-dsl": "^1.0.1", + "source-map": "^0.5.7", + "sprintf-js": "^1.1.1" + }, + "dependencies": { + "sprintf-js": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", + "dev": true + } + } + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + }, + "dependencies": { + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + } + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" + }, + "compare-versions": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.5.1.tgz", + "integrity": "sha512-9fGPIB7C6AyM18CJJBHt5EnCZDG3oiTJYy0NjfIAGjKpzv0tkxWko7TNQHF5ymqm7IH03tqmeuBxtvD+Izh6mg==", + "dev": true + }, + "component-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "component-inherit": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", + "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", + "dev": true + }, + "compressible": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.17.tgz", + "integrity": "sha512-BGHeLCK1GV7j1bSmQQAi26X+GgWcTjLr/0tzSvMCl3LH1w1IJ4PFSPoV5316b30cneTziC+B1a+3OjoSUcQYmw==", + "dev": true, + "requires": { + "mime-db": ">= 1.40.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "dev": true, + "requires": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true + }, + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true, + "optional": true + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "requires": { + "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": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "copy-webpack-plugin": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.6.0.tgz", + "integrity": "sha512-Y+SQCF+0NoWQryez2zXn5J5knmr9z/9qSQt7fbL78u83rxmigOy8X5+BFn8CFSuX+nKT8gpYwJX68ekqtQt6ZA==", + "dev": true, + "requires": { + "cacache": "^10.0.4", + "find-cache-dir": "^1.0.0", + "globby": "^7.1.1", + "is-glob": "^4.0.0", + "loader-utils": "^1.1.0", + "minimatch": "^3.0.4", + "p-limit": "^1.0.0", + "serialize-javascript": "^1.4.0" + }, + "dependencies": { + "find-cache-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", + "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^1.0.0", + "pkg-dir": "^2.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + } + } + } + }, + "core-js": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.4.7.tgz", + "integrity": "sha512-qaPVGw30J1wQ0GR3GvoPqlGf9GZfKKF4kFC7kiHlcsPTqH3txrs9crCp3ZiMAXuSenhz89Jnl4GZs/67S5VOSg==" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dev": true, + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + } + }, + "cp-file": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/cp-file/-/cp-file-6.2.0.tgz", + "integrity": "sha512-fmvV4caBnofhPe8kOcitBwSn2f39QLjnAnGq3gO9dfd75mUytzKNZB1hde6QHunW2Rt+OwuBOMc3i1tNElbszA==", + "requires": { + "graceful-fs": "^4.1.2", + "make-dir": "^2.0.0", + "nested-error-stacks": "^2.0.0", + "pify": "^4.0.1", + "safe-buffer": "^5.0.1" + } + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "requires": { + "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": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "requires": { + "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": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", + "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", + "requires": { + "lru-cache": "^4.0.1", + "which": "^1.2.9" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "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" + } + }, + "css-parse": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-1.7.0.tgz", + "integrity": "sha1-Mh9s9zeCpv91ERE5D8BeLGV9jJs=", + "dev": true + }, + "css-selector-tokenizer": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz", + "integrity": "sha512-xYL0AMZJ4gFzJQsHUKa5jiWWi2vH77WVNg7JYRyewwj6oPh4yb/y6Y9ZCw9dsj/9UauMhtuxR+ogQd//EdEVNA==", + "dev": true, + "requires": { + "cssesc": "^0.1.0", + "fastparse": "^1.1.1", + "regexpu-core": "^1.0.0" + } + }, + "cssauron": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/cssauron/-/cssauron-1.4.0.tgz", + "integrity": "sha1-pmAt/34EqDBtwNuaVR6S6LVmKtg=", + "dev": true, + "requires": { + "through": "X.X.X" + } + }, + "cssesc": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", + "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=", + "dev": true + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "optional": true, + "requires": { + "array-find-index": "^1.0.1" + } + }, + "custom-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", + "dev": true + }, + "cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "date-format": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.1.0.tgz", + "integrity": "sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA==", + "dev": true + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "dev": true, + "requires": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + } + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "default-gateway": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-2.7.2.tgz", + "integrity": "sha512-lAc4i9QJR0YHSDFdzeBQKfZ1SRDG3hsJNEkrpcZa8QhBfidLAilT60BDEIVUUGqosFp425KOgB3uYqcnQrWafQ==", + "dev": true, + "requires": { + "execa": "^0.10.0", + "ip-regex": "^2.1.0" + } + }, + "default-require-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", + "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", + "requires": { + "strip-bom": "^3.0.0" + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "del": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", + "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true, + "optional": true + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "dependency-graph": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.7.2.tgz", + "integrity": "sha512-KqtH4/EZdtdfWX0p6MGP9jljvxSY6msy/pRUD4jgNwVpv3v1QmNLlsB3LDSSUg79BRVSn7jI1QPRtArGABovAQ==", + "dev": true + }, + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "detect-node": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", + "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", + "dev": true + }, + "di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", + "dev": true + }, + "diff": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz", + "integrity": "sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "dir-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "dev": true, + "requires": { + "path-type": "^3.0.0" + } + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "dev": true + }, + "dns-packet": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", + "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", + "dev": true, + "requires": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dev": true, + "requires": { + "buffer-indexof": "^1.0.0" + } + }, + "dom-serialize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", + "dev": true, + "requires": { + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.322", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.322.tgz", + "integrity": "sha512-Tc8JQEfGQ1MzfSzI/bTlSr7btJv/FFO7Yh6tanqVmIWOuNCu6/D1MilIEgLtmWqIrsv+o4IjpLAhgMBr/ncNAA==", + "dev": true + }, + "elliptic": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", + "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==", + "dev": true, + "requires": { + "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" + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "encoding": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "dev": true, + "requires": { + "iconv-lite": "~0.4.13" + } + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "engine.io": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.2.1.tgz", + "integrity": "sha512-+VlKzHzMhaU+GsCIg4AoXF1UdDFjHHwMmMKqMJNDNLlUlejz58FCy4LBqB2YVJskHGYl06BatYWKP2TVdVXE5w==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "engine.io-client": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.2.1.tgz", + "integrity": "sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "engine.io-parser": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.3.tgz", + "integrity": "sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==", + "dev": true, + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "~0.0.7", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.5", + "has-binary2": "~1.0.2" + } + }, + "enhanced-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", + "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "tapable": "^1.0.0" + } + }, + "ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", + "dev": true + }, + "err-code": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-1.1.2.tgz", + "integrity": "sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=", + "dev": true + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.16.2.tgz", + "integrity": "sha512-jYo/J8XU2emLXl3OLwfwtuFfuF2w6DYPs+xy9ZfVyPkDcrauu6LYrw/q2TyCtrbc/KUdCiC5e9UajRhgNkVopA==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.4", + "is-regex": "^1.0.4", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "string.prototype.trimleft": "^2.1.0", + "string.prototype.trimright": "^2.1.0" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==" + }, + "es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", + "dev": true + }, + "es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "dev": true, + "requires": { + "es6-promise": "^4.0.3" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "escodegen": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", + "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", + "dev": true, + "requires": { + "esprima": "^2.7.1", + "estraverse": "^1.9.1", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.2.0" + }, + "dependencies": { + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + }, + "source-map": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", + "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", + "dev": true, + "optional": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + }, + "dependencies": { + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + } + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + }, + "dependencies": { + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + } + } + }, + "estraverse": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", + "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "eventemitter3": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.0.tgz", + "integrity": "sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg==", + "dev": true + }, + "events": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", + "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==", + "dev": true + }, + "eventsource": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", + "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", + "dev": true, + "requires": { + "original": "^1.0.0" + } + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "execa": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz", + "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + } + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dev": true, + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "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.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fastparse": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", + "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", + "dev": true + }, + "faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "figgy-pudding": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", + "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", + "dev": true + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-loader": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-2.0.0.tgz", + "integrity": "sha512-YCsBfd1ZGCyonOKLxPiKPdu+8ld9HAaMEvJewzz+b2eTF7uL5Zm/HdBF6FjCrpCMRq25Mi0U1gl4pwn2TlH7hQ==", + "dev": true, + "requires": { + "loader-utils": "^1.0.2", + "schema-utils": "^1.0.0" + } + }, + "fileset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", + "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", + "dev": true, + "requires": { + "glob": "^7.0.3", + "minimatch": "^3.0.3" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "flatted": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", + "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", + "dev": true + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "follow-redirects": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.9.0.tgz", + "integrity": "sha512-CRcPzsSIbXyVDl0QI01muNDu69S8trU4jArW9LpOt2WtC6LyUJetcIrmfHsRBx7/Jb6GHJUiuqyYxPooFfNt6A==", + "dev": true, + "requires": { + "debug": "^3.0.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + }, + "foreground-child": { + "version": "1.5.6", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", + "integrity": "sha1-T9ca0t/elnibmApcCilZN8svXOk=", + "requires": { + "cross-spawn": "^4", + "signal-exit": "^3.0.0" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-access": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", + "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=", + "dev": true, + "requires": { + "null-check": "^1.0.0" + } + }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs-minipass": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "dev": true, + "requires": { + "minipass": "^2.6.0" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", + "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.12.1", + "node-pre-gyp": "^0.12.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true, + "optional": true + }, + "minipass": { + "version": "2.3.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.3.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^4.1.0", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.12.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.7.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "yallist": { + "version": "3.0.3", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "dev": true, + "optional": true, + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "gaze": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", + "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", + "dev": true, + "optional": true, + "requires": { + "globule": "^1.0.0" + } + }, + "genfun": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/genfun/-/genfun-5.0.0.tgz", + "integrity": "sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true, + "optional": true + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" + }, + "globby": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", + "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "globule": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.1.tgz", + "integrity": "sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==", + "dev": true, + "optional": true, + "requires": { + "glob": "~7.1.1", + "lodash": "~4.17.10", + "minimatch": "~3.0.2" + } + }, + "graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" + }, + "handle-thing": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.0.tgz", + "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==", + "dev": true + }, + "handlebars": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.5.3.tgz", + "integrity": "sha512-3yPecJoJHK/4c6aZhSvxOyG4vJKDshV36VHp0iVCDVh7o9w2vwi3NSnL2MMPj3YdduqaBcu7cGbggJQM0br9xA==", + "requires": { + "neo-async": "^2.6.0", + "optimist": "^0.6.1", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "dev": true, + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + } + } + }, + "has-binary2": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", + "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", + "dev": true, + "requires": { + "isarray": "2.0.1" + }, + "dependencies": { + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + } + } + }, + "has-cors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "dev": true, + "optional": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hasha": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-3.0.0.tgz", + "integrity": "sha1-UqMvq4Vp1BymmmH/GiFPjrfIvTk=", + "requires": { + "is-stream": "^1.0.1" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "hosted-git-info": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.5.tgz", + "integrity": "sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg==" + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "html-entities": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", + "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", + "dev": true + }, + "http-cache-semantics": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", + "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", + "dev": true + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "dev": true + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "http-parser-js": { + "version": "0.4.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz", + "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=", + "dev": true + }, + "http-proxy": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.0.tgz", + "integrity": "sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ==", + "dev": true, + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-agent": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", + "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", + "dev": true, + "requires": { + "agent-base": "4", + "debug": "3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "http-proxy-middleware": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.18.0.tgz", + "integrity": "sha512-Fs25KVMPAIIcgjMZkVHJoKg9VcXcC1C8yb9JUgeDvVXY0S/zgVIhMb+qVswDIgtJe2DfckMSY2d6TuTEutlk6Q==", + "dev": true, + "requires": { + "http-proxy": "^1.16.2", + "is-glob": "^4.0.0", + "lodash": "^4.17.5", + "micromatch": "^3.1.9" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "https-proxy-agent": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", + "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", + "dev": true, + "requires": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", + "dev": true, + "requires": { + "ms": "^2.0.0" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true + }, + "ignore-walk": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", + "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", + "dev": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", + "dev": true, + "optional": true + }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", + "dev": true + }, + "import-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", + "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", + "dev": true, + "requires": { + "import-from": "^2.1.0" + } + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dev": true, + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } + } + }, + "import-from": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", + "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } + } + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + }, + "in-publish": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz", + "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=", + "dev": true, + "optional": true + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "optional": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "inquirer": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.1.tgz", + "integrity": "sha512-088kl3DRT2dLU5riVMKKr1DlImd6X7smDhpXUCkJDCKvTEJeRiXh0G132HG9u5a+6Ylw9plFRY7RuTnwohYSpg==", + "dev": true, + "requires": { + "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": "^5.0.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + } + } + }, + "internal-ip": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-3.0.1.tgz", + "integrity": "sha512-NXXgESC2nNVtU+pqmC9e6R8B1GpKxzsAQhffvh5AL79qKnodd+L7tnEQmTiUAVngqLalPbSqRA7XGIEL5nCd0Q==", + "dev": true, + "requires": { + "default-gateway": "^2.6.0", + "ipaddr.js": "^1.5.2" + } + }, + "interpret": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", + "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", + "dev": true + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "dev": true + }, + "ipaddr.js": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", + "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-arguments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", + "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-callable": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "dev": true + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dev": true + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "dev": true, + "requires": { + "is-path-inside": "^1.0.0" + } + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, + "requires": { + "path-is-inside": "^1.0.1" + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "^1.0.1" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true, + "optional": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isbinaryfile": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz", + "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==", + "dev": true, + "requires": { + "buffer-alloc": "^1.2.0" + } + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "istanbul": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz", + "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=", + "dev": true, + "requires": { + "abbrev": "1.0.x", + "async": "1.x", + "escodegen": "1.8.x", + "esprima": "2.7.x", + "glob": "^5.0.15", + "handlebars": "^4.0.1", + "js-yaml": "3.x", + "mkdirp": "0.5.x", + "nopt": "3.x", + "once": "1.x", + "resolve": "1.1.x", + "supports-color": "^3.1.0", + "which": "^1.1.1", + "wordwrap": "^1.0.0" + }, + "dependencies": { + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + }, + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + } + } + }, + "istanbul-api": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-2.1.6.tgz", + "integrity": "sha512-x0Eicp6KsShG1k1rMgBAi/1GgY7kFGEBwQpw3PXGEmu+rBcBNhqU8g2DgY9mlepAsLPzrzrbqSgCGANnki4POA==", + "dev": true, + "requires": { + "async": "^2.6.2", + "compare-versions": "^3.4.0", + "fileset": "^2.0.3", + "istanbul-lib-coverage": "^2.0.5", + "istanbul-lib-hook": "^2.0.7", + "istanbul-lib-instrument": "^3.3.0", + "istanbul-lib-report": "^2.0.8", + "istanbul-lib-source-maps": "^3.0.6", + "istanbul-reports": "^2.2.4", + "js-yaml": "^3.13.1", + "make-dir": "^2.1.0", + "minimatch": "^3.0.4", + "once": "^1.4.0" + }, + "dependencies": { + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + } + } + }, + "istanbul-instrumenter-loader": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-instrumenter-loader/-/istanbul-instrumenter-loader-3.0.1.tgz", + "integrity": "sha512-a5SPObZgS0jB/ixaKSMdn6n/gXSrK2S6q/UfRJBT3e6gQmVjwZROTODQsYW5ZNwOu78hG62Y3fWlebaVOL0C+w==", + "dev": true, + "requires": { + "convert-source-map": "^1.5.0", + "istanbul-lib-instrument": "^1.7.3", + "loader-utils": "^1.1.0", + "schema-utils": "^0.3.0" + }, + "dependencies": { + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz", + "integrity": "sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz", + "integrity": "sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A==", + "dev": true, + "requires": { + "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" + } + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true + }, + "schema-utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", + "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", + "dev": true, + "requires": { + "ajv": "^5.0.0" + } + } + } + }, + "istanbul-lib-coverage": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==" + }, + "istanbul-lib-hook": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.7.tgz", + "integrity": "sha512-vrRztU9VRRFDyC+aklfLoeXyNdTfga2EI3udDGn4cZ6fpSXpHLV9X6CHvfoMCPtggg8zvDDmC4b9xfu0z6/llA==", + "requires": { + "append-transform": "^1.0.0" + } + }, + "istanbul-lib-instrument": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", + "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", + "requires": { + "@babel/generator": "^7.4.0", + "@babel/parser": "^7.4.3", + "@babel/template": "^7.4.0", + "@babel/traverse": "^7.4.3", + "@babel/types": "^7.4.0", + "istanbul-lib-coverage": "^2.0.5", + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "istanbul-lib-report": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", + "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", + "requires": { + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "supports-color": "^6.1.0" + }, + "dependencies": { + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", + "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "rimraf": "^2.6.3", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "istanbul-reports": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.6.tgz", + "integrity": "sha512-SKi4rnMyLBKe0Jy2uUdx28h8oG7ph2PPuQPvIAh31d+Ci+lSiEu4C+h3oBPuJ9+mPKhOyW0M8gY4U5NM1WLeXA==", + "requires": { + "handlebars": "^4.1.2" + } + }, + "jasmine": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.8.0.tgz", + "integrity": "sha1-awicChFXax8W3xG4AUbZHU6Lij4=", + "dev": true, + "requires": { + "exit": "^0.1.2", + "glob": "^7.0.6", + "jasmine-core": "~2.8.0" + }, + "dependencies": { + "jasmine-core": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.8.0.tgz", + "integrity": "sha1-vMl5rh+f0FcB5F5S5l06XWPxok4=", + "dev": true + } + } + }, + "jasmine-core": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.3.0.tgz", + "integrity": "sha512-3/xSmG/d35hf80BEN66Y6g9Ca5l/Isdeg/j6zvbTYlTzeKinzmaTM4p9am5kYqOmE05D7s1t8FGjzdSnbUbceA==", + "dev": true + }, + "jasmine-spec-reporter": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-4.2.1.tgz", + "integrity": "sha512-FZBoZu7VE5nR7Nilzy+Np8KuVIOxF4oXDPDknehCYBDE080EnlPu0afdZNmpGDBRCUBv3mj5qgqCRmk6W/K8vg==", + "dev": true, + "requires": { + "colors": "1.1.2" + } + }, + "jasminewd2": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/jasminewd2/-/jasminewd2-2.2.0.tgz", + "integrity": "sha1-43zwsX8ZnM4jvqcbIDk5Uka07E4=", + "dev": true + }, + "js-base64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.1.tgz", + "integrity": "sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw==", + "dev": true, + "optional": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json3": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", + "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "jszip": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.2.2.tgz", + "integrity": "sha512-NmKajvAFQpbg3taXQXr/ccS2wcucR1AZ+NtyWp2Nq7HHVsXhcJFR8p0Baf32C2yVvBylFWVeKf+WI2AnvlPhpA==", + "dev": true, + "requires": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "set-immediate-shim": "~1.0.1" + } + }, + "karma": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/karma/-/karma-4.4.1.tgz", + "integrity": "sha512-L5SIaXEYqzrh6b1wqYC42tNsFMx2PWuxky84pK9coK09MvmL7mxii3G3bZBh/0rvD27lqDd0le9jyhzvwif73A==", + "dev": true, + "requires": { + "bluebird": "^3.3.0", + "body-parser": "^1.16.1", + "braces": "^3.0.2", + "chokidar": "^3.0.0", + "colors": "^1.1.0", + "connect": "^3.6.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.0", + "flatted": "^2.0.0", + "glob": "^7.1.1", + "graceful-fs": "^4.1.2", + "http-proxy": "^1.13.0", + "isbinaryfile": "^3.0.0", + "lodash": "^4.17.14", + "log4js": "^4.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.3.0" + }, + "dependencies": { + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "binary-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", + "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", + "dev": true + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "chokidar": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", + "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", + "dev": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.1", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.2.0" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "fsevents": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", + "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", + "dev": true, + "optional": true + }, + "glob-parent": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", + "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "mime": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", + "dev": true + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "readdirp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", + "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", + "dev": true, + "requires": { + "picomatch": "^2.0.4" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + } + } + }, + "karma-chrome-launcher": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz", + "integrity": "sha512-uf/ZVpAabDBPvdPdveyk1EPgbnloPvFFGgmRhYLTDH7gEB4nZdSBk8yTU47w1g/drLSx5uMOkjKk7IWKfWg/+w==", + "dev": true, + "requires": { + "fs-access": "^1.0.0", + "which": "^1.2.1" + } + }, + "karma-cli": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/karma-cli/-/karma-cli-2.0.0.tgz", + "integrity": "sha512-1Kb28UILg1ZsfqQmeELbPzuEb5C6GZJfVIk0qOr8LNYQuYWmAaqP16WpbpKEjhejDrDYyYOwwJXSZO6u7q5Pvw==", + "dev": true, + "requires": { + "resolve": "^1.3.3" + } + }, + "karma-coverage-istanbul-reporter": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-2.1.1.tgz", + "integrity": "sha512-CH8lTi8+kKXGvrhy94+EkEMldLCiUA0xMOiL31vvli9qK0T+qcXJAwWBRVJWnVWxYkTmyWar8lPz63dxX6/z1A==", + "dev": true, + "requires": { + "istanbul-api": "^2.1.6", + "minimatch": "^3.0.4" + } + }, + "karma-jasmine": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-2.0.1.tgz", + "integrity": "sha512-iuC0hmr9b+SNn1DaUD2QEYtUxkS1J+bSJSn7ejdEexs7P8EYvA1CWkEdrDQ+8jVH3AgWlCNwjYsT1chjcNW9lA==", + "dev": true, + "requires": { + "jasmine-core": "^3.3" + } + }, + "karma-jasmine-html-reporter": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.4.2.tgz", + "integrity": "sha512-7g0gPj8+9JepCNJR9WjDyQ2RkZ375jpdurYQyAYv8PorUCadepl8vrD6LmMqOGcM17cnrynBawQYZHaumgDjBw==", + "dev": true + }, + "karma-source-map-support": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.3.0.tgz", + "integrity": "sha512-HcPqdAusNez/ywa+biN4EphGz62MmQyPggUsDfsHqa7tSe4jdsxgvTKuDfIazjL+IOxpVWyT7Pr4dhAV+sxX5Q==", + "dev": true, + "requires": { + "source-map-support": "^0.5.5" + } + }, + "killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "^1.0.0" + } + }, + "less": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/less/-/less-3.9.0.tgz", + "integrity": "sha512-31CmtPEZraNUtuUREYjSqRkeETFdyEHSEPAGq4erDlUXtda7pzNmctdljdIagSb589d/qXGWiiP31R5JVf+v0w==", + "dev": true, + "requires": { + "clone": "^2.1.2", + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "mime": "^1.4.1", + "mkdirp": "^0.5.0", + "promise": "^7.1.1", + "request": "^2.83.0", + "source-map": "~0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + } + } + }, + "less-loader": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-4.1.0.tgz", + "integrity": "sha512-KNTsgCE9tMOM70+ddxp9yyt9iHqgmSs0yTZc5XH5Wo+g80RWRIYNqE58QJKm/yMud5wZEvz50ugRDuzVIkyahg==", + "dev": true, + "requires": { + "clone": "^2.1.1", + "loader-utils": "^1.1.0", + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "license-webpack-plugin": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-2.0.4.tgz", + "integrity": "sha512-FQgOqrrIcD4C/VQo6ecWgXZULK5rs0kIDJtHcSVO6SBUrD63kEHZwmKOvBTquFQSgMQn/yeH68qooKDfqiBF2Q==", + "dev": true, + "requires": { + "@types/webpack-sources": "^0.1.5", + "webpack-sources": "^1.2.0" + } + }, + "lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dev": true, + "requires": { + "immediate": "~3.0.5" + } + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + } + } + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "dev": true + }, + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + }, + "lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", + "dev": true, + "optional": true + }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", + "dev": true + }, + "lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=" + }, + "lodash.mergewith": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", + "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==", + "dev": true, + "optional": true + }, + "lodash.tail": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.tail/-/lodash.tail-4.1.1.tgz", + "integrity": "sha1-0jM6NtnncXyK0vfKyv7HwytERmQ=", + "dev": true + }, + "log4js": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-4.5.1.tgz", + "integrity": "sha512-EEEgFcE9bLgaYUKuozyFfytQM2wDHtXn4tAN41pkaxpNjAykv11GVdeI4tHtmPWW4Xrgh9R/2d7XYghDVjbKKw==", + "dev": true, + "requires": { + "date-format": "^2.0.0", + "debug": "^4.1.1", + "flatted": "^2.0.0", + "rfdc": "^1.1.4", + "streamroller": "^1.0.6" + } + }, + "loglevel": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.6.tgz", + "integrity": "sha512-Sgr5lbboAUBo3eXCSPL4/KoVz3ROKquOjcctxmHIt+vol2DrqTQe3SwkKKuYhEiWB5kYa13YyopJ69deJ1irzQ==", + "dev": true + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "optional": true, + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "magic-string": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.4.tgz", + "integrity": "sha512-oycWO9nEVAP2RVPbIoDoA4Y7LFIJ3xRYov93gAyJhZkET1tNuB0u7uWkZS2LpBWTJUWnmau/To8ECWRC+jKNfw==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.4" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "make-error": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", + "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", + "dev": true + }, + "make-fetch-happen": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-4.0.2.tgz", + "integrity": "sha512-YMJrAjHSb/BordlsDEcVcPyTbiJKkzqMf48N8dAJZT9Zjctrkb6Yg4TY9Sq2AwSIQJFn5qBBKVTYt3vP5FMIHA==", + "dev": true, + "requires": { + "agentkeepalive": "^3.4.1", + "cacache": "^11.3.3", + "http-cache-semantics": "^3.8.1", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^2.2.1", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "node-fetch-npm": "^2.0.2", + "promise-retry": "^1.1.1", + "socks-proxy-agent": "^4.0.0", + "ssri": "^6.0.0" + }, + "dependencies": { + "cacache": { + "version": "11.3.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.3.tgz", + "integrity": "sha512-p8WcneCytvzPxhDvYp31PD039vi77I12W+/KfR9S8AZbaiARFBCpsPJS+9uhWfeBfeAtW7o/4vt3MUqLkbY6nA==", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dev": true, + "requires": { + "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" + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } + }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "dev": true, + "requires": { + "p-defer": "^1.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true, + "optional": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "mem": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "optional": true, + "requires": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "optional": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "optional": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true, + "optional": true + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "optional": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "optional": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "optional": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true, + "optional": true + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "optional": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "optional": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "optional": true, + "requires": { + "is-utf8": "^0.2.0" + } + } + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "merge-source-map": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", + "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", + "requires": { + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "mime-db": { + "version": "1.42.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.42.0.tgz", + "integrity": "sha512-UbfJCR4UAVRNgMpfImz05smAXK7+c+ZntjaA26ANtkXLlOe947Aag5zdIcKQULAiF9Cq4WxBi9jUs5zkA84bYQ==", + "dev": true + }, + "mime-types": { + "version": "2.1.25", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.25.tgz", + "integrity": "sha512-5KhStqB5xpTAeGqKBAMgwaYMnQik7teQN4IAzC7npDv6kzeU6prfkR67bc87J1kWMPGkoaZSq1npmexMgkmEVg==", + "dev": true, + "requires": { + "mime-db": "1.42.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "mini-css-extract-plugin": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.4.4.tgz", + "integrity": "sha512-o+Jm+ocb0asEngdM6FsZWtZsRzA8koFUudIDwYUfl94M3PejPHG7Vopw5hN9V8WsMkSFpm3tZP3Fesz89EyrfQ==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "schema-utils": "^1.0.0", + "webpack-sources": "^1.1.0" + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=" + }, + "minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + }, + "dependencies": { + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } + }, + "minizlib": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "dev": true, + "requires": { + "minipass": "^2.9.0" + } + }, + "mississippi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz", + "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==", + "dev": true, + "requires": { + "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" + } + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mixin-object": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz", + "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=", + "dev": true, + "requires": { + "for-in": "^0.1.3", + "is-extendable": "^0.1.1" + }, + "dependencies": { + "for-in": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz", + "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=", + "dev": true + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + } + } + }, + "moment": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", + "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "requires": { + "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": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dev": true, + "requires": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + } + }, + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "dev": true + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "dev": true, + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "dev": true + }, + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==" + }, + "nested-error-stacks": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.1.0.tgz", + "integrity": "sha512-AO81vsIO1k1sM4Zrd6Hu7regmJN1NSiAja10gc4bX3F0wd+9rQmcuHQaHVQCYIEC8iFXnE+mavh23GOt7wBgug==" + }, + "ng2-charts": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/ng2-charts/-/ng2-charts-2.3.0.tgz", + "integrity": "sha512-D5K7OqF0m5lOBYvNOsraoEo4OPHja9zfGNj+HWy2nUcP0LP2s+Y/QaQlkG/1rHlwXq9HPm8rLxzSutA0eLHxGQ==", + "requires": { + "@types/chart.js": "^2.7.48", + "lodash": "^4.17.11", + "tslib": "^1.9.0" + } + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node-fetch-npm": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.2.tgz", + "integrity": "sha512-nJIxm1QmAj4v3nfCvEeCrYSoVwXyxLnaPBK5W1W5DGEJwjlKuC2VEUycGw5oxk+4zZahRrB84PUJJgEmhFTDFw==", + "dev": true, + "requires": { + "encoding": "^0.1.11", + "json-parse-better-errors": "^1.0.0", + "safe-buffer": "^5.1.1" + } + }, + "node-forge": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz", + "integrity": "sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ==", + "dev": true + }, + "node-gyp": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", + "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", + "dev": true, + "optional": true, + "requires": { + "fstream": "^1.0.0", + "glob": "^7.0.3", + "graceful-fs": "^4.1.2", + "mkdirp": "^0.5.0", + "nopt": "2 || 3", + "npmlog": "0 || 1 || 2 || 3 || 4", + "osenv": "0", + "request": "^2.87.0", + "rimraf": "2", + "semver": "~5.3.0", + "tar": "^2.0.0", + "which": "1" + }, + "dependencies": { + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "dev": true, + "optional": true + } + } + }, + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "dev": true, + "requires": { + "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": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "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.11.0", + "vm-browserify": "^1.0.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "node-releases": { + "version": "1.1.41", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.41.tgz", + "integrity": "sha512-+IctMa7wIs8Cfsa8iYzeaLTFwv5Y4r5jZud+4AnfymzeEXKBCavFX0KBgzVaPVqf0ywa6PrO8/b+bPqdwjGBSg==", + "dev": true, + "requires": { + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "node-sass": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.10.0.tgz", + "integrity": "sha512-fDQJfXszw6vek63Fe/ldkYXmRYK/QS6NbvM3i5oEo9ntPDy4XX7BcKZyTKv+/kSSxRtXXc7l+MSwEmYc0CSy6Q==", + "dev": true, + "optional": true, + "requires": { + "async-foreach": "^0.1.3", + "chalk": "^1.1.1", + "cross-spawn": "^3.0.0", + "gaze": "^1.0.0", + "get-stdin": "^4.0.1", + "glob": "^7.0.3", + "in-publish": "^2.0.0", + "lodash.assign": "^4.2.0", + "lodash.clonedeep": "^4.3.2", + "lodash.mergewith": "^4.6.0", + "meow": "^3.7.0", + "mkdirp": "^0.5.1", + "nan": "^2.10.0", + "node-gyp": "^3.8.0", + "npmlog": "^4.0.0", + "request": "^2.88.0", + "sass-graph": "^2.2.4", + "stdout-stream": "^1.4.0", + "true-case-path": "^1.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "optional": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true, + "optional": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "optional": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "cross-spawn": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", + "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", + "dev": true, + "optional": true, + "requires": { + "lru-cache": "^4.0.1", + "which": "^1.2.9" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true, + "optional": true + } + } + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true + }, + "npm-bundled": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.6.tgz", + "integrity": "sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==", + "dev": true + }, + "npm-package-arg": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.0.tgz", + "integrity": "sha512-zYbhP2k9DbJhA0Z3HKUePUgdB1x7MfIfKssC+WLPFMKTBZKpZh5m13PgexJjCq6KW7j17r0jHWcCpxEqnnncSA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.6.0", + "osenv": "^0.1.5", + "semver": "^5.5.0", + "validate-npm-package-name": "^3.0.0" + } + }, + "npm-packlist": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.6.tgz", + "integrity": "sha512-u65uQdb+qwtGvEJh/DgQgW1Xg7sqeNbmxYyrvlNznaVTjV3E5P6F/EFjM+BVHXl7JJlsdG8A64M0XI8FI/IOlg==", + "dev": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npm-pick-manifest": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-2.2.3.tgz", + "integrity": "sha512-+IluBC5K201+gRU85vFlUwX3PFShZAbAgDNp2ewJdWMVSppdo/Zih0ul2Ecky/X7b51J7LrrUAP+XOmOCvYZqA==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1", + "npm-package-arg": "^6.0.0", + "semver": "^5.4.1" + } + }, + "npm-registry-fetch": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-3.9.1.tgz", + "integrity": "sha512-VQCEZlydXw4AwLROAXWUR7QDfe2Y8Id/vpAgp6TI1/H78a4SiQ1kQrKZALm5/zxM5n4HIi+aYb+idUAV/RuY0Q==", + "dev": true, + "requires": { + "JSONStream": "^1.3.4", + "bluebird": "^3.5.1", + "figgy-pudding": "^3.4.1", + "lru-cache": "^5.1.1", + "make-fetch-happen": "^4.0.2", + "npm-package-arg": "^6.1.0" + }, + "dependencies": { + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "null-check": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/null-check/-/null-check-1.0.0.tgz", + "integrity": "sha1-l33/1xdgErnsMNKjnbXPcqBDnt0=", + "dev": true + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "nyc": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-14.1.1.tgz", + "integrity": "sha512-OI0vm6ZGUnoGZv/tLdZ2esSVzDwUC88SNs+6JoSOMVxA+gKMB8Tk7jBwgemLx4O40lhhvZCVw1C+OYLOBOPXWw==", + "requires": { + "archy": "^1.0.0", + "caching-transform": "^3.0.2", + "convert-source-map": "^1.6.0", + "cp-file": "^6.2.0", + "find-cache-dir": "^2.1.0", + "find-up": "^3.0.0", + "foreground-child": "^1.5.6", + "glob": "^7.1.3", + "istanbul-lib-coverage": "^2.0.5", + "istanbul-lib-hook": "^2.0.7", + "istanbul-lib-instrument": "^3.3.0", + "istanbul-lib-report": "^2.0.8", + "istanbul-lib-source-maps": "^3.0.6", + "istanbul-reports": "^2.2.4", + "js-yaml": "^3.13.1", + "make-dir": "^2.1.0", + "merge-source-map": "^1.1.0", + "resolve-from": "^4.0.0", + "rimraf": "^2.6.3", + "signal-exit": "^3.0.2", + "spawn-wrap": "^1.4.2", + "test-exclude": "^5.2.3", + "uuid": "^3.3.2", + "yargs": "^13.2.2", + "yargs-parser": "^13.0.0" + } + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-component": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", + "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-hash": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.1.tgz", + "integrity": "sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==" + }, + "object-inspect": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", + "dev": true + }, + "object-is": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.1.tgz", + "integrity": "sha1-CqYOyZiaCz7Xlc9NBvYs8a1lObY=", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.getownpropertydescriptors": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", + "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.5.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + }, + "dependencies": { + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + } + } + }, + "open": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/open/-/open-6.0.0.tgz", + "integrity": "sha512-/yb5mVZBz7mHLySMiSj2DcLtMBbFPJk5JBKEkHVZFxZAPzeg3L026O0T+lbdz1B2nyDnkClRSwRQJdeVUIF7zw==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + } + }, + "opn": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.4.0.tgz", + "integrity": "sha512-YF9MNdVy/0qvJvDtunAOzFw9iasOQHpVthTCvGzxt61Il64AYSGdK+rYwld7NAfk9qJ7dt+hymBNSc9LNYS+Sw==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "original": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "dev": true, + "requires": { + "url-parse": "^1.4.3" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "optional": true, + "requires": { + "lcid": "^1.0.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", + "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", + "dev": true + }, + "p-limit": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", + "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-map": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", + "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", + "dev": true + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "package-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-3.0.0.tgz", + "integrity": "sha512-lOtmukMDVvtkL84rJHI7dpTYq+0rli8N2wlnqUcBuDWCfVhRUfOmnR9SsoHFMLpACvEV60dX7rd0rFaYDZI+FA==", + "requires": { + "graceful-fs": "^4.1.15", + "hasha": "^3.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" + } + }, + "pacote": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-9.4.0.tgz", + "integrity": "sha512-WQ1KL/phGMkedYEQx9ODsjj7xvwLSpdFJJdEXrLyw5SILMxcTNt5DTxT2Z93fXuLFYJBlZJdnwdalrQdB/rX5w==", + "dev": true, + "requires": { + "bluebird": "^3.5.3", + "cacache": "^11.3.2", + "figgy-pudding": "^3.5.1", + "get-stream": "^4.1.0", + "glob": "^7.1.3", + "lru-cache": "^5.1.1", + "make-fetch-happen": "^4.0.1", + "minimatch": "^3.0.4", + "minipass": "^2.3.5", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "normalize-package-data": "^2.4.0", + "npm-package-arg": "^6.1.0", + "npm-packlist": "^1.1.12", + "npm-pick-manifest": "^2.2.3", + "npm-registry-fetch": "^3.8.0", + "osenv": "^0.1.5", + "promise-inflight": "^1.0.1", + "promise-retry": "^1.1.1", + "protoduck": "^5.0.1", + "rimraf": "^2.6.2", + "safe-buffer": "^5.1.2", + "semver": "^5.6.0", + "ssri": "^6.0.1", + "tar": "^4.4.8", + "unique-filename": "^1.1.1", + "which": "^1.3.1" + }, + "dependencies": { + "cacache": { + "version": "11.3.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.3.tgz", + "integrity": "sha512-p8WcneCytvzPxhDvYp31PD039vi77I12W+/KfR9S8AZbaiARFBCpsPJS+9uhWfeBfeAtW7o/4vt3MUqLkbY6nA==", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dev": true, + "requires": { + "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" + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "tar": { + "version": "4.4.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", + "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", + "dev": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } + }, + "pako": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", + "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==", + "dev": true + }, + "parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "dev": true, + "requires": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "parse-asn1": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", + "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", + "dev": true, + "requires": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", + "optional": true + }, + "parseqs": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", + "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", + "dev": true, + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseuri": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", + "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", + "dev": true, + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "requires": { + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + } + } + }, + "pbkdf2": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "picomatch": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.1.1.tgz", + "integrity": "sha512-OYMyqkKzK7blWO/+XZYP6w8hH0LDvkBvdvKukti+7kqYFCiEAk+gI3DWnryapc0Dau05ugGTy0foQ6mqn4AHYA==", + "dev": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "requires": { + "find-up": "^3.0.0" + } + }, + "portfinder": { + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.17.tgz", + "integrity": "sha512-syFcRIRzVI1BoEFOCaAiizwDolh1S1YXSodsVhncbhjzjZQulhczNRbqnUl9N31Q4dKGOXsNDqxC2BWBgSMqeQ==", + "dev": true, + "requires": { + "async": "^1.5.2", + "debug": "^2.2.0", + "mkdirp": "0.5.x" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "postcss": { + "version": "7.0.13", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.13.tgz", + "integrity": "sha512-h8SY6kQTd1wISHWjz+E6cswdhMuyBZRb16pSTv3W4zYZ3/YbyWeJdNUeOXB5IdZqE1U76OUEjjjqsC3z2f3hVg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-import": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-12.0.1.tgz", + "integrity": "sha512-3Gti33dmCjyKBgimqGxL3vcV8w9+bsHwO5UrBawp796+jdardbcFl4RP5w/76BwNL7aGzpKstIfF9I+kdE8pTw==", + "dev": true, + "requires": { + "postcss": "^7.0.1", + "postcss-value-parser": "^3.2.3", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + } + }, + "postcss-load-config": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.0.tgz", + "integrity": "sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q==", + "dev": true, + "requires": { + "cosmiconfig": "^5.0.0", + "import-cwd": "^2.0.0" + } + }, + "postcss-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", + "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "postcss": "^7.0.0", + "postcss-load-config": "^2.0.0", + "schema-utils": "^1.0.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "prettier": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", + "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", + "dev": true + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dev": true, + "optional": true, + "requires": { + "asap": "~2.0.3" + } + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "promise-retry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-1.1.1.tgz", + "integrity": "sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0=", + "dev": true, + "requires": { + "err-code": "^1.0.0", + "retry": "^0.10.0" + } + }, + "protoduck": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/protoduck/-/protoduck-5.0.1.tgz", + "integrity": "sha512-WxoCeDCoCBY55BMvj4cAEjdVUFGRWed9ZxPlqTKYyw1nDDTQ4pqmnIMAGfJlg7Dx35uB/M+PHJPTmGOvaCaPTg==", + "dev": true, + "requires": { + "genfun": "^5.0.0" + } + }, + "protractor": { + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/protractor/-/protractor-5.4.2.tgz", + "integrity": "sha512-zlIj64Cr6IOWP7RwxVeD8O4UskLYPoyIcg0HboWJL9T79F1F0VWtKkGTr/9GN6BKL+/Q/GmM7C9kFVCfDbP5sA==", + "dev": true, + "requires": { + "@types/q": "^0.0.32", + "@types/selenium-webdriver": "^3.0.0", + "blocking-proxy": "^1.0.0", + "browserstack": "^1.5.1", + "chalk": "^1.1.3", + "glob": "^7.0.3", + "jasmine": "2.8.0", + "jasminewd2": "^2.1.0", + "optimist": "~0.6.0", + "q": "1.4.1", + "saucelabs": "^1.5.0", + "selenium-webdriver": "3.6.0", + "source-map-support": "~0.4.0", + "webdriver-js-extender": "2.1.0", + "webdriver-manager": "^12.0.6" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "dev": true, + "requires": { + "globby": "^5.0.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "rimraf": "^2.2.8" + } + }, + "globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "requires": { + "source-map": "^0.5.6" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "webdriver-manager": { + "version": "12.1.7", + "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.7.tgz", + "integrity": "sha512-XINj6b8CYuUYC93SG3xPkxlyUc3IJbD6Vvo75CVGuG9uzsefDzWQrhz0Lq8vbPxtb4d63CZdYophF8k8Or/YiA==", + "dev": true, + "requires": { + "adm-zip": "^0.4.9", + "chalk": "^1.1.1", + "del": "^2.2.0", + "glob": "^7.0.3", + "ini": "^1.3.4", + "minimist": "^1.2.0", + "q": "^1.4.1", + "request": "^2.87.0", + "rimraf": "^2.5.2", + "semver": "^5.3.0", + "xml2js": "^0.4.17" + } + } + } + }, + "proxy-addr": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", + "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", + "dev": true, + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.0" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + }, + "psl": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.5.0.tgz", + "integrity": "sha512-4vqUjKi2huMu1OJiLhi3jN6jeeKvMZdI1tYgi/njW5zV52jNLgSAZSdN16m9bJFe61/cT8ulmw4qFitV9QRsEA==", + "dev": true + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "requires": { + "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" + } + }, + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "q": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", + "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=", + "dev": true + }, + "qjobs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", + "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", + "dev": true + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "querystringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", + "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + } + } + }, + "raw-loader": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-0.5.1.tgz", + "integrity": "sha1-DD0L6u2KAclm2Xh793goElKpeao=", + "dev": true + }, + "read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", + "dev": true, + "requires": { + "pify": "^2.3.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "read-pkg-up": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", + "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", + "requires": { + "find-up": "^3.0.0", + "read-pkg": "^3.0.0" + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "requires": { + "resolve": "^1.1.6" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "optional": true, + "requires": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + } + }, + "reflect-metadata": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", + "dev": true + }, + "regenerate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", + "dev": true + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regexp.prototype.flags": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.2.0.tgz", + "integrity": "sha512-ztaw4M1VqgMwl9HlPpOuiYgItcHlunW0He2fE6eNfT6E/CF2FtYi9ofOYe4mKntstYk0Fyh/rDRBdS3AnxjlrA==", + "dev": true, + "requires": { + "define-properties": "^1.1.2" + } + }, + "regexpu-core": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", + "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", + "dev": true, + "requires": { + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" + } + }, + "regjsgen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", + "dev": true + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", + "requires": { + "es6-error": "^4.0.1" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "resolve": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.13.1.tgz", + "integrity": "sha512-CxqObCX8K8YtAhOBRg+lrcdn+LK+WYOS8tSjqSFbjtrI5PnS63QPhZl4+yKfrU9tdsbMu9Anr/amegT87M9Z6w==", + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "retry": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz", + "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=", + "dev": true + }, + "rfdc": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.1.4.tgz", + "integrity": "sha512-5C9HXdzK8EAqN7JDif30jqsBzavB7wLpaubisuQIGHWf2gUXSpzy6ArX/+Da8RjFpagWsCn+pIgxTMAmKw9Zug==", + "dev": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "dev": true, + "requires": { + "is-promise": "^2.1.0" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "requires": { + "aproba": "^1.1.1" + } + }, + "rxjs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz", + "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==", + "requires": { + "tslib": "^1.9.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "sass-graph": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz", + "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=", + "dev": true, + "optional": true, + "requires": { + "glob": "^7.0.0", + "lodash": "^4.0.0", + "scss-tokenizer": "^0.2.3", + "yargs": "^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "optional": true + }, + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true, + "optional": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "optional": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "optional": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "optional": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "optional": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "optional": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true, + "optional": true + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "optional": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "optional": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "optional": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "dev": true, + "optional": true + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true, + "optional": true + }, + "yargs": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", + "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", + "dev": true, + "optional": true, + "requires": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^5.0.0" + } + }, + "yargs-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", + "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", + "dev": true, + "optional": true, + "requires": { + "camelcase": "^3.0.0" + } + } + } + }, + "sass-loader": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-7.1.0.tgz", + "integrity": "sha512-+G+BKGglmZM2GUSfT9TLuEp6tzehHPjAMoRRItOojWIqIGPloVCMhNIQuG639eJ+y033PaGTSjLaTHts8Kw79w==", + "dev": true, + "requires": { + "clone-deep": "^2.0.1", + "loader-utils": "^1.0.1", + "lodash.tail": "^4.1.1", + "neo-async": "^2.5.0", + "pify": "^3.0.0", + "semver": "^5.5.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "saucelabs": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.5.0.tgz", + "integrity": "sha512-jlX3FGdWvYf4Q3LFfFWS1QvPg3IGCGWxIc8QBFdPTbpTJnt/v17FHXYVAn7C8sHf1yUXo2c7yIM0isDryfYtHQ==", + "dev": true, + "requires": { + "https-proxy-agent": "^2.2.1" + } + }, + "sax": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz", + "integrity": "sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE=", + "dev": true + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "scss-tokenizer": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", + "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", + "dev": true, + "optional": true, + "requires": { + "js-base64": "^2.1.8", + "source-map": "^0.4.2" + }, + "dependencies": { + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "optional": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true + }, + "selenium-webdriver": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-3.6.0.tgz", + "integrity": "sha512-WH7Aldse+2P5bbFBO4Gle/nuQOdVwpHMTL6raL3uuBj/vPG07k6uzt3aiahu352ONBr5xXh0hDlM3LhtXPOC4Q==", + "dev": true, + "requires": { + "jszip": "^3.1.3", + "rimraf": "^2.5.4", + "tmp": "0.0.30", + "xml2js": "^0.4.17" + }, + "dependencies": { + "tmp": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz", + "integrity": "sha1-ckGdSovn1s51FI/YsyTlk6cRwu0=", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.1" + } + } + } + }, + "selfsigned": { + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.7.tgz", + "integrity": "sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA==", + "dev": true, + "requires": { + "node-forge": "0.9.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "semver-dsl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/semver-dsl/-/semver-dsl-1.0.1.tgz", + "integrity": "sha1-02eN5VVeimH2Ke7QJTZq5fJzQKA=", + "dev": true, + "requires": { + "semver": "^5.3.0" + } + }, + "semver-intersect": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/semver-intersect/-/semver-intersect-1.4.0.tgz", + "integrity": "sha512-d8fvGg5ycKAq0+I6nfWeCx6ffaWJCsBYU0H2Rq56+/zFePYfT8mXkB3tWBSjR5BerkHNZ5eTPIk1/LBYas35xQ==", + "dev": true, + "requires": { + "semver": "^5.0.0" + } + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dev": true, + "requires": { + "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.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "serialize-javascript": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.9.1.tgz", + "integrity": "sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A==", + "dev": true + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "dev": true + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shallow-clone": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-1.0.0.tgz", + "integrity": "sha512-oeXreoKR/SyNJtRJMAKPDSvd28OqEwG4eR/xc856cRGBII7gX9lvAqDxusPm0846z/w/hWYjI1NpKwJ00NHzRA==", + "dev": true, + "requires": { + "is-extendable": "^0.1.1", + "kind-of": "^5.0.0", + "mixin-object": "^2.0.1" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "shelljs": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.3.tgz", + "integrity": "sha512-fc0BKlAWiLpwZljmOvAOTE/gXawtCoNrP5oaY7KIaQbbyHeQVg01pSEuEGvGh3HEdBU4baCD7wQBwADmM/7f7A==", + "dev": true, + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "smart-buffer": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz", + "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "socket.io": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.1.1.tgz", + "integrity": "sha512-rORqq9c+7W0DAK3cleWNSyfv/qKXV99hV4tZe+gGLfBECw3XEhBy7x85F3wypA9688LKjtwO9pX9L33/xQI8yA==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "socket.io-adapter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz", + "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==", + "dev": true + }, + "socket.io-client": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.1.1.tgz", + "integrity": "sha512-jxnFyhAuFxYfjqIgduQlhzqTcOEQSn+OHKVfAxWaNWa7ecP7xSNk2Dx/3UEsDcY7NcFafxvNvKPmmO7HTwTxGQ==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "socket.io-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.2.0.tgz", + "integrity": "sha512-FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA==", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "debug": "~3.1.0", + "isarray": "2.0.1" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "sockjs": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", + "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", + "dev": true, + "requires": { + "faye-websocket": "^0.10.0", + "uuid": "^3.0.1" + } + }, + "sockjs-client": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.3.0.tgz", + "integrity": "sha512-R9jxEzhnnrdxLCNln0xg5uGHqMnkhPSTzUZH2eXcR03S/On9Yvoq2wyUZILRUhZCNVu2PmwWVoyuiPz8th8zbg==", + "dev": true, + "requires": { + "debug": "^3.2.5", + "eventsource": "^1.0.7", + "faye-websocket": "~0.11.1", + "inherits": "^2.0.3", + "json3": "^3.3.2", + "url-parse": "^1.4.3" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "faye-websocket": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", + "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + } + } + }, + "socks": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.3.tgz", + "integrity": "sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA==", + "dev": true, + "requires": { + "ip": "1.1.5", + "smart-buffer": "^4.1.0" + } + }, + "socks-proxy-agent": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz", + "integrity": "sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg==", + "dev": true, + "requires": { + "agent-base": "~4.2.1", + "socks": "~2.3.2" + }, + "dependencies": { + "agent-base": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", + "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", + "dev": true, + "requires": { + "es6-promisify": "^5.0.0" + } + } + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, + "source-map-loader": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-0.2.4.tgz", + "integrity": "sha512-OU6UJUty+i2JDpTItnizPrlpOIBLmQbWMuBg9q5bVtnHACqw1tn9nNwqJLbv0/00JjnJb/Ee5g5WS5vrRv7zIQ==", + "dev": true, + "requires": { + "async": "^2.5.0", + "loader-utils": "^1.1.0" + }, + "dependencies": { + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + } + } + }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "dev": true, + "requires": { + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz", + "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "sourcemap-codec": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.6.tgz", + "integrity": "sha512-1ZooVLYFxC448piVLBbtOxFcXwnymH9oUF8nRd3CuYDVvkRBxRl6pB4Mtas5a4drtL+E8LDgFkQNcgIw6tc8Hg==", + "dev": true + }, + "spawn-wrap": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-1.4.3.tgz", + "integrity": "sha512-IgB8md0QW/+tWqcavuFgKYR/qIRvJkRLPJDFaoXtLLUaVcCDK0+HeFTkmQHj3eprcYhc+gOl0aEA1w7qZlYezw==", + "requires": { + "foreground-child": "^1.5.6", + "mkdirp": "^0.5.0", + "os-homedir": "^1.0.1", + "rimraf": "^2.6.2", + "signal-exit": "^3.0.2", + "which": "^1.3.0" + } + }, + "spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==" + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==" + }, + "spdy": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.1.tgz", + "integrity": "sha512-HeZS3PBdMA+sZSu0qwpCxl3DeALD5ASx8pAX0jZdKXSpPWbQ6SYGnlg3BBmYLx5LtiZrmkAZfErCm2oECBcioA==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + } + }, + "spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + }, + "dependencies": { + "readable-stream": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", + "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "speed-measure-webpack-plugin": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/speed-measure-webpack-plugin/-/speed-measure-webpack-plugin-1.2.5.tgz", + "integrity": "sha512-S/guYjC4Izn5wY2d0+M4zowED/F77Lxh9yjkTZ+XAr244pr9c1MYNcXcRe9lx2hmAj0GPbOrBXgOF2YIp/CZ8A==", + "dev": true, + "requires": { + "chalk": "^2.0.1" + } + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "ssri": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz", + "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.1" + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "stats-webpack-plugin": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/stats-webpack-plugin/-/stats-webpack-plugin-0.7.0.tgz", + "integrity": "sha512-NT0YGhwuQ0EOX+uPhhUcI6/+1Sq/pMzNuSCBVT4GbFl/ac6I/JZefBcjlECNfAb1t3GOx5dEj1Z7x0cAxeeVLQ==", + "dev": true, + "requires": { + "lodash": "^4.17.4" + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + }, + "stdout-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", + "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", + "dev": true, + "optional": true, + "requires": { + "readable-stream": "^2.0.1" + } + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "requires": { + "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": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", + "dev": true + }, + "streamroller": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-1.0.6.tgz", + "integrity": "sha512-3QC47Mhv3/aZNFpDDVO44qQb9gwB9QggMEE0sQmkTAwBVYdBRWISdsywlkfm5II1Q5y/pmrHflti/IgmIzdDBg==", + "dev": true, + "requires": { + "async": "^2.6.2", + "date-format": "^2.0.0", + "debug": "^3.2.6", + "fs-extra": "^7.0.1", + "lodash": "^4.17.14" + }, + "dependencies": { + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "string.prototype.trimleft": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz", + "integrity": "sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string.prototype.trimright": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz", + "integrity": "sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "optional": true, + "requires": { + "get-stdin": "^4.0.1" + } + }, + "style-loader": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.23.1.tgz", + "integrity": "sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "schema-utils": "^1.0.0" + } + }, + "stylus": { + "version": "0.54.5", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.5.tgz", + "integrity": "sha1-QrlWCTHKcJDOhRWnmLqeaqPW3Hk=", + "dev": true, + "requires": { + "css-parse": "1.7.x", + "debug": "*", + "glob": "7.0.x", + "mkdirp": "0.5.x", + "sax": "0.5.x", + "source-map": "0.1.x" + }, + "dependencies": { + "glob": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", + "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.2", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "stylus-loader": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-3.0.2.tgz", + "integrity": "sha512-+VomPdZ6a0razP+zinir61yZgpw2NfljeSsdUF5kJuEzlo3khXhY19Fn6l8QQz1GRJGtMCo8nG5C04ePyV7SUA==", + "dev": true, + "requires": { + "loader-utils": "^1.0.2", + "lodash.clonedeep": "^4.5.0", + "when": "~3.6.x" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "symbol-observable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", + "dev": true + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true + }, + "tar": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", + "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", + "dev": true, + "optional": true, + "requires": { + "block-stream": "*", + "fstream": "^1.0.12", + "inherits": "2" + } + }, + "terser": { + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-3.17.0.tgz", + "integrity": "sha512-/FQzzPJmCpjAH9Xvk2paiWrFq+5M6aVOf+2KRbwhByISDX/EujxsK+BAvrhb6H+2rtrLCHK9N01wO014vrIwVQ==", + "dev": true, + "requires": { + "commander": "^2.19.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.10" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", + "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + } + } + }, + "terser-webpack-plugin": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.2.1.tgz", + "integrity": "sha512-GGSt+gbT0oKcMDmPx4SRSfJPE1XaN3kQRWG4ghxKQw9cn5G9x6aCKSsgYdvyM0na9NJ4Drv0RG6jbBByZ5CMjw==", + "dev": true, + "requires": { + "cacache": "^11.0.2", + "find-cache-dir": "^2.0.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^1.4.0", + "source-map": "^0.6.1", + "terser": "^3.8.1", + "webpack-sources": "^1.1.0", + "worker-farm": "^1.5.2" + }, + "dependencies": { + "cacache": { + "version": "11.3.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.3.tgz", + "integrity": "sha512-p8WcneCytvzPxhDvYp31PD039vi77I12W+/KfR9S8AZbaiARFBCpsPJS+9uhWfeBfeAtW7o/4vt3MUqLkbY6nA==", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dev": true, + "requires": { + "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" + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } + }, + "test-exclude": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", + "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", + "requires": { + "glob": "^7.1.3", + "minimatch": "^3.0.4", + "read-pkg-up": "^4.0.0", + "require-main-filename": "^2.0.0" + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "timers-browserify": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", + "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", + "dev": true, + "requires": { + "setimmediate": "^1.0.4" + } + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "to-array": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", + "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", + "dev": true + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "dev": true, + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "tree-kill": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.0.tgz", + "integrity": "sha512-DlX6dR0lOIRDFxI0mjL9IYg6OTncLm/Zt+JiBhE5OlFcAR8yc9S7FFXU9so0oda47frdM/JFsk7UjNt9vscKcg==", + "dev": true + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true, + "optional": true + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "true-case-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", + "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.2" + } + }, + "ts-node": { + "version": "8.5.4", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.5.4.tgz", + "integrity": "sha512-izbVCRV68EasEPQ8MSIGBNK9dc/4sYJJKYA+IarMQct1RtEot6Xp0bXuClsbUSnKpg50ho+aOAx8en5c+y4OFw==", + "dev": true, + "requires": { + "arg": "^4.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "source-map-support": "^0.5.6", + "yn": "^3.0.0" + } + }, + "tslib": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", + "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==" + }, + "tslint": { + "version": "5.20.1", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.20.1.tgz", + "integrity": "sha512-EcMxhzCFt8k+/UP5r8waCf/lzmeSyVlqxqMEDQE7rWYiQky8KpIBz1JAoYXfROHrPZ1XXd43q8yQnULOLiBRQg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.3.0", + "commander": "^2.12.1", + "diff": "^4.0.1", + "glob": "^7.1.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.8.0", + "tsutils": "^2.29.0" + } + }, + "tsutils": { + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", + "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "typescript": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.2.4.tgz", + "integrity": "sha512-0RNDbSdEokBeEAkgNbxJ+BLwSManFy9TeXz8uW+48j/xhEXv1ePME60olyzw2XzUqUBNAYFeJadIqAgNqIACwg==", + "dev": true + }, + "uglify-js": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.7.1.tgz", + "integrity": "sha512-pnOF7jY82wdIhATVn87uUY/FHU+MDUdPLkmGFvGoclQmeu229eTkbG5gjGGBi3R7UuYYSEeYXY/TTY5j2aym2g==", + "optional": true, + "requires": { + "commander": "~2.20.3", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true + } + } + }, + "ultron": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", + "dev": true + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "url-parse": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", + "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", + "dev": true, + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "useragent": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.3.0.tgz", + "integrity": "sha512-4AoH4pxuSvHCjqLO04sU6U/uE65BYza8l/KKBS0b0hnUPWi+cQ2BpeTEwejCSx9SPV5/U03nniDTrWx5NrmKdw==", + "dev": true, + "requires": { + "lru-cache": "4.1.x", + "tmp": "0.0.x" + } + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dev": true, + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "uuid": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", + "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==" + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "validate-npm-package-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", + "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", + "dev": true, + "requires": { + "builtins": "^1.0.3" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true + }, + "void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", + "dev": true + }, + "watchpack": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", + "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "dev": true, + "requires": { + "chokidar": "^2.0.2", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + } + }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, + "webdriver-js-extender": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/webdriver-js-extender/-/webdriver-js-extender-2.1.0.tgz", + "integrity": "sha512-lcUKrjbBfCK6MNsh7xaY2UAUmZwe+/ib03AjVOpFobX4O7+83BUveSrLfU0Qsyb1DaKJdQRbuU+kM9aZ6QUhiQ==", + "dev": true, + "requires": { + "@types/selenium-webdriver": "^3.0.0", + "selenium-webdriver": "^3.0.1" + } + }, + "webpack": { + "version": "4.28.4", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.28.4.tgz", + "integrity": "sha512-NxjD61WsK/a3JIdwWjtIpimmvE6UrRi3yG54/74Hk9rwNj5FPkA4DJCf1z4ByDWLkvZhTZE+P3C/eh6UD5lDcw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-module-context": "1.7.11", + "@webassemblyjs/wasm-edit": "1.7.11", + "@webassemblyjs/wasm-parser": "1.7.11", + "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", + "terser-webpack-plugin": "^1.1.0", + "watchpack": "^1.5.0", + "webpack-sources": "^1.3.0" + }, + "dependencies": { + "schema-utils": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", + "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "webpack-core": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/webpack-core/-/webpack-core-0.6.9.tgz", + "integrity": "sha1-/FcViMhVjad76e+23r3Fo7FyvcI=", + "dev": true, + "requires": { + "source-list-map": "~0.1.7", + "source-map": "~0.4.1" + }, + "dependencies": { + "source-list-map": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-0.1.8.tgz", + "integrity": "sha1-xVCyq1Qn9rPyH1r+rYjE9Vh7IQY=", + "dev": true + }, + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "webpack-dev-middleware": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.4.0.tgz", + "integrity": "sha512-Q9Iyc0X9dP9bAsYskAVJ/hmIZZQwf/3Sy4xCAZgL5cUkjZmUZLt4l5HpbST/Pdgjn3u6pE7u5OdGd1apgzRujA==", + "dev": true, + "requires": { + "memory-fs": "~0.4.1", + "mime": "^2.3.1", + "range-parser": "^1.0.3", + "webpack-log": "^2.0.0" + }, + "dependencies": { + "mime": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", + "dev": true + } + } + }, + "webpack-dev-server": { + "version": "3.1.14", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.1.14.tgz", + "integrity": "sha512-mGXDgz5SlTxcF3hUpfC8hrQ11yhAttuUQWf1Wmb+6zo3x6rb7b9mIfuQvAPLdfDRCGRGvakBWHdHOa0I9p/EVQ==", + "dev": true, + "requires": { + "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", + "semver": "^5.6.0", + "serve-index": "^1.7.2", + "sockjs": "0.3.19", + "sockjs-client": "1.3.0", + "spdy": "^4.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^5.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "3.4.0", + "webpack-log": "^2.0.0", + "yargs": "12.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "decamelize": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-2.0.0.tgz", + "integrity": "sha512-Ikpp5scV3MSYxY39ymh45ZLEecsTdv/Xj2CaQfI8RLMuwi7XvjX9H/fhraiSuU+C5w5NTDu4ZU72xNiZnurBPg==", + "dev": true, + "requires": { + "xregexp": "4.0.0" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "dev": true + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "yargs": { + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.2.tgz", + "integrity": "sha512-e7SkEx6N6SIZ5c5H22RTZae61qtn3PYUE8JYbBFlK9sYmh3DMQ6E5ygtaG/2BW0JZi4WGgTR2IV5ChqlqrDGVQ==", + "dev": true, + "requires": { + "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" + } + }, + "yargs-parser": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", + "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", + "dev": true, + "requires": { + "camelcase": "^4.1.0" + } + } + } + }, + "webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "dev": true, + "requires": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + } + }, + "webpack-merge": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.1.4.tgz", + "integrity": "sha512-TmSe1HZKeOPey3oy1Ov2iS3guIZjWvMT2BBJDzzT5jScHTjVC3mpjJofgueEzaEd6ibhxRDD6MIblDr8tzh8iQ==", + "dev": true, + "requires": { + "lodash": "^4.17.5" + } + }, + "webpack-sources": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz", + "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "webpack-subresource-integrity": { + "version": "1.1.0-rc.6", + "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-1.1.0-rc.6.tgz", + "integrity": "sha512-Az7y8xTniNhaA0620AV1KPwWOqawurVVDzQSpPAeR5RwNbL91GoBSJAAo9cfd+GiFHwsS5bbHepBw1e6Hzxy4w==", + "dev": true, + "requires": { + "webpack-core": "^0.6.8" + } + }, + "websocket-driver": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.3.tgz", + "integrity": "sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg==", + "dev": true, + "requires": { + "http-parser-js": ">=0.4.0 <0.4.11", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", + "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", + "dev": true + }, + "when": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/when/-/when-3.6.4.tgz", + "integrity": "sha1-RztRfsFZ4rhQBUl6E5g/CVQS404=", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true, + "optional": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "optional": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" + }, + "worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "dev": true, + "requires": { + "errno": "~0.1.7" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write-file-atomic": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" + } + }, + "xml2js": { + "version": "0.4.22", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.22.tgz", + "integrity": "sha512-MWTbxAQqclRSTnehWWe5nMKzI3VmJ8ltiJEco8akcC6j3miOhjjfzKum5sId+CWhfxdOs/1xauYr8/ZDBtQiRw==", + "dev": true, + "requires": { + "sax": ">=0.6.0", + "util.promisify": "~1.0.0", + "xmlbuilder": "~11.0.0" + }, + "dependencies": { + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + } + } + }, + "xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "dev": true + }, + "xmlhttprequest-ssl": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", + "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=", + "dev": true + }, + "xregexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.0.0.tgz", + "integrity": "sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg==", + "dev": true + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + }, + "yargs": { + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", + "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.1" + } + }, + "yargs-parser": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "yeast": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", + "dev": true + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true + }, + "zone.js": { + "version": "0.8.29", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.8.29.tgz", + "integrity": "sha512-mla2acNCMkWXBD+c+yeUrBUrzOxYMNFdQ6FGfigGGtEVBPJx07BQeJekjt9DmH1FtZek4E9rE1eRR9qQpxACOQ==" + } + } +} diff --git a/core/app/engine/package.json b/core/app/engine/package.json new file mode 100644 index 000000000..5b18b8db5 --- /dev/null +++ b/core/app/engine/package.json @@ -0,0 +1,62 @@ +{ + "name": "suitecrm", + "version": "0.0.0", + "scripts": { + "ng": "ng", + "start": "ng serve", + "build": "ng build", + "test": "ng test", + "lint": "ng lint", + "e2e": "ng e2e" + }, + "private": true, + "dependencies": { + "@angular/animations": "^7.2.2", + "@angular/cdk": "^7.2.2", + "@angular/common": "^7.2.2", + "@angular/compiler": "^7.2.2", + "@angular/core": "^7.2.2", + "@angular/forms": "^7.2.2", + "@angular/http": "^7.2.2", + "@angular/material": "^7.2.2", + "@angular/platform-browser": "^7.2.2", + "@angular/platform-browser-dynamic": "^7.2.2", + "@angular/router": "^7.2.2", + "@ng-bootstrap/ng-bootstrap": "^4.2.2", + "bootstrap-css-only": "^4.3.1", + "@types/object-hash": "^1.3.0", + "nyc": "~14.1.1", + "chart.js": "^2.8.0", + "chartjs-plugin-annotation": "^0.5.7", + "core-js": "^3.4.5", + "ng2-charts": "^2.2.3", + "object-hash": "^1.3.1", + "rxjs": "^6.3.3", + "tslib": "^1.9.3", + "zone.js": "~0.8.26", + "ajv": "~6.9.1" + }, + "devDependencies": { + "@angular-devkit/build-angular": "0.12.4", + "@angular/cli": "^7.2.2", + "@angular/compiler-cli": "^7.2.2", + "@angular/language-service": "^7.2.2", + "@types/jasmine": "^3.3.7", + "@types/jasminewd2": "^2.0.6", + "@types/node": "^10.12.18", + "codelyzer": "^4.5.0", + "jasmine-core": "~3.3.0", + "jasmine-spec-reporter": "^4.2.1", + "karma": "^4.0.0", + "karma-chrome-launcher": "^2.2.0", + "karma-cli": "^2.0.0", + "karma-coverage-istanbul-reporter": "^2.0.4", + "karma-jasmine": "^2.0.1", + "karma-jasmine-html-reporter": "^1.4.0", + "prettier": "^1.16.1", + "protractor": "^5.4.2", + "ts-node": "^8.0.1", + "tslint": "^5.12.1", + "typescript": "~3.2.4" + } +} diff --git a/core/app/engine/src/app/app-manager/app-manager.module.ts b/core/app/engine/src/app/app-manager/app-manager.module.ts new file mode 100644 index 000000000..31fcf0f71 --- /dev/null +++ b/core/app/engine/src/app/app-manager/app-manager.module.ts @@ -0,0 +1,72 @@ +import { + ANALYZE_FOR_ENTRY_COMPONENTS, + ModuleWithProviders, + NgModule, + NgModuleFactoryLoader, + SystemJsNgModuleLoader, + Type +} from '@angular/core'; + +import {ROUTES} from '@angular/router'; + +import {AppManager} from './app-manager.service'; + +import { + APP_COMPONENT, + APP_MANIFESTS, + APP_MODULE, + AppManifest +} from './app-manifest'; + +@NgModule() +export class AppManagerModule { + static forRoot(manifests: AppManifest[]): ModuleWithProviders { + return { + ngModule: AppManagerModule, + providers: [ + AppManager, + {provide: NgModuleFactoryLoader, useClass: SystemJsNgModuleLoader}, + // provider for Angular CLI to analyzes + {provide: ROUTES, useValue: manifests, multi: true}, + // provider for AppManager to analyze + {provide: APP_MANIFESTS, useValue: manifests} + ] + }; + } + + static forModule(manifest: AppManifest): ModuleWithProviders { + return { + ngModule: AppManagerModule, + providers: [ + { + provide: ANALYZE_FOR_ENTRY_COMPONENTS, + useValue: manifest, + multi: true + }, + // provider for @angular/router to parse + {provide: ROUTES, useValue: manifest, multi: true}, + // provider for AppManager to analyze + {provide: APP_MODULE, useValue: manifest} + ] + }; + } + + static forChild(component: Type): ModuleWithProviders { + return { + ngModule: AppManagerModule, + providers: [ + { + provide: ANALYZE_FOR_ENTRY_COMPONENTS, + useValue: component, + multi: true + }, + // provider for @angular/router to parse + {provide: ROUTES, useValue: [], multi: true}, + // provider for AppManager to analyze + {provide: APP_COMPONENT, useValue: component} + ] + }; + } +} + +export {AppManifest} from './app-manifest'; diff --git a/core/app/engine/src/app/app-manager/app-manager.service.ts b/core/app/engine/src/app/app-manager/app-manager.service.ts new file mode 100644 index 000000000..9319a4625 --- /dev/null +++ b/core/app/engine/src/app/app-manager/app-manager.service.ts @@ -0,0 +1,127 @@ +import { + ComponentFactory, + Inject, + Injectable, + Injector, + NgModuleFactory, + NgModuleFactoryLoader +} from '@angular/core'; + +import {from, Observable, throwError} from 'rxjs'; + +import { + AppManifest, + APP_COMPONENT, + APP_MANIFESTS, + APP_MODULE +} from './app-manifest'; + +@Injectable() +export class AppManager { + constructor( + @Inject(APP_MANIFESTS) + private manifests: AppManifest[], + private loader: NgModuleFactoryLoader, + private injector: Injector + ) { + } + + /** Retrieve a ComponentFactory, based on the specified componentId + * (defined in the AppManifest array). + */ + getComponentFactory( + componentId: string, + injector?: Injector + ): Observable> { + const manifest = this.manifests.find(m => m.componentId === componentId); + if (!manifest) { + return throwError( + `AppManager: Unknown componentId "${componentId}"` + ); + } + + const path = manifest.loadChildren; + + const p = this.load(path, componentId, injector); + return from(p); + } + + load( + path: string, + componentId: string, + injector?: Injector + ): Promise> { + return this.loader + .load(path) + .then(ngModuleFactory => + this.loadFactory(ngModuleFactory, componentId, injector) + ); + } + + loadFactory( + ngModuleFactory: NgModuleFactory, + componentId: string, + injector?: Injector + ): Promise> { + const moduleRef = ngModuleFactory.create(injector || this.injector); + const appComponentType = moduleRef.injector.get( + APP_COMPONENT, + null + ); + if (!appComponentType) { + const AppModule: AppManifest = moduleRef.injector.get( + APP_MODULE, + null + ); + + if (!AppModule) { + throw new Error( + 'AppManager: App module for' + + ` componentId "${componentId}" does not contain` + + ' APP_COMPONENT or App_MODULE as a provider.' + ); + } + if (AppModule.componentId !== componentId) { + throw new Error( + 'AppManager: App module for' + + `${componentId} does not match manifest.` + ); + } + + const path = AppModule.loadChildren; + + if (!path) { + throw new Error(`${componentId} unknown!`); + } + + return this.load(path, componentId, injector); + } + + return Promise.resolve( + moduleRef.componentFactoryResolver.resolveComponentFactory( + appComponentType + ) + ); + } + + loadAppComponent(outlet: any, componentId: string, data: any) { + this.getComponentFactory(componentId) + .subscribe({ + next: componentFactory => { + if (!outlet) { + return; + } + + const ref = outlet.createComponent(componentFactory); + ref.changeDetectorRef.detectChanges(); + + const appComponent = ref.instance; + + appComponent.data = data; + }, + error: err => { + console.warn(err); + } + }); + } +} diff --git a/core/app/engine/src/app/app-manager/app-manifest.ts b/core/app/engine/src/app/app-manager/app-manifest.ts new file mode 100644 index 000000000..35a79b254 --- /dev/null +++ b/core/app/engine/src/app/app-manager/app-manifest.ts @@ -0,0 +1,16 @@ +import {InjectionToken} from '@angular/core'; + +export const APP_COMPONENT = new InjectionToken('APP_COMPONENT'); +export const APP_MODULE = new InjectionToken('APP_MODULE'); +export const APP_MANIFESTS = new InjectionToken('APP_MANIFESTS'); + +export interface AppManifest { + /** Unique identifier, used in the application to retrieve a ComponentFactory. */ + componentId: string; + + /** Unique identifier, used internally by Angular. */ + path: string; + + /** Path to component module. */ + loadChildren: string; +} diff --git a/core/app/engine/src/app/app-routing.module.ts b/core/app/engine/src/app/app-routing.module.ts new file mode 100644 index 000000000..8ce24b965 --- /dev/null +++ b/core/app/engine/src/app/app-routing.module.ts @@ -0,0 +1,46 @@ +import {NgModule} from '@angular/core'; +import {Routes, RouterModule} from '@angular/router'; +import {ClassicViewUiComponent} from './app-files/ui/components/classic-view/classic-view.component'; + +import {AuthGuard} from './app-files/ui/services/auth/auth-guard.service'; + +const routes: Routes = [ + { + path: 'Login', + loadChildren: './app-files/ui/components/login/login.module#LoginUiModule' + }, + { + path: 'Logout', + loadChildren: './app-files/ui/components/logout/logout.module#LogoutUiModule' + }, + { + path: 'Home', + loadChildren: './app-files/ui/components/home/home.module#HomeUiModule', + canActivate: [AuthGuard] + }, + { + path: ':module', + component: ClassicViewUiComponent, + canActivate: [AuthGuard] + }, + { + path: ':module/:action', + component: ClassicViewUiComponent, + canActivate: [AuthGuard] + }, + { + path: ':module/:action/:record', + component: ClassicViewUiComponent, + canActivate: [AuthGuard] + }, + {path: '**', redirectTo: 'Login'}, +]; + +@NgModule({ + imports: [RouterModule.forRoot(routes, { + useHash: true + })], + exports: [RouterModule] +}) +export class AppRoutingModule { +} diff --git a/core/app/engine/src/app/app.component.html b/core/app/engine/src/app/app.component.html new file mode 100644 index 000000000..991f1f360 --- /dev/null +++ b/core/app/engine/src/app/app.component.html @@ -0,0 +1,5 @@ + + +
+ + diff --git a/core/app/engine/src/app/app.component.scss b/core/app/engine/src/app/app.component.scss new file mode 100644 index 000000000..e69de29bb diff --git a/core/app/engine/src/app/app.component.spec.ts b/core/app/engine/src/app/app.component.spec.ts new file mode 100644 index 000000000..b4328d5b1 --- /dev/null +++ b/core/app/engine/src/app/app.component.spec.ts @@ -0,0 +1,19 @@ +import {async, ComponentFixture, TestBed, inject} from '@angular/core/testing'; +import {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'; +import {FormsModule} from '@angular/forms'; +import {RouterTestingModule} from '@angular/router/testing'; +import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing'; + +import {AppComponent} from './app.component'; + +describe('AppComponent', () => { + beforeEach(async(() => { + TestBed.configureTestingModule({ + schemas: [CUSTOM_ELEMENTS_SCHEMA], + imports: [RouterTestingModule, HttpClientTestingModule, FormsModule], + declarations: [ + AppComponent + ], + }).compileComponents(); + })); +}); diff --git a/core/app/engine/src/app/app.component.ts b/core/app/engine/src/app/app.component.ts new file mode 100644 index 000000000..e87651492 --- /dev/null +++ b/core/app/engine/src/app/app.component.ts @@ -0,0 +1,17 @@ +import {Component, ViewChild, ViewContainerRef, OnInit} from '@angular/core'; + +@Component({ + selector: 'app-root', + templateUrl: './app.component.html' +}) +export class AppComponent implements OnInit { + @ViewChild('mainOutlet', {read: ViewContainerRef}) + mainOutlet: ViewContainerRef | undefined; + + constructor() { + } + + ngOnInit() { + + } +} diff --git a/core/app/engine/src/app/app.module.ts b/core/app/engine/src/app/app.module.ts new file mode 100644 index 000000000..c98ec41b8 --- /dev/null +++ b/core/app/engine/src/app/app.module.ts @@ -0,0 +1,38 @@ +import {NgModule, CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'; +import {BrowserModule} from '@angular/platform-browser'; +import {HttpClientModule} from '@angular/common/http'; + +import {AppRoutingModule} from './app-routing.module'; +import {AppComponent} from './app.component'; + +import {NavbarUiModule} from './app-files/ui/components/navbar/navbar.module'; +import {FooterUiModule} from './app-files/ui/components/footer/footer.module'; +import {ClassicViewUiModule} from './app-files/ui/components/classic-view/classic-view.module'; +import {MessageUiModule} from './app-files/ui/components/message/message.module'; + +import { + AppManagerModule +} from './app-manager/app-manager.module'; + +@NgModule({ + declarations: [ + AppComponent + ], + imports: [ + BrowserModule, + HttpClientModule, + AppManagerModule, + AppRoutingModule, + FooterUiModule, + NavbarUiModule, + MessageUiModule, + ClassicViewUiModule + ], + bootstrap: [AppComponent], + entryComponents: [] +}) +export class AppModule { + constructor() { + + } +} diff --git a/core/app/engine/src/environments/environment.prod.ts b/core/app/engine/src/environments/environment.prod.ts new file mode 100644 index 000000000..3612073bc --- /dev/null +++ b/core/app/engine/src/environments/environment.prod.ts @@ -0,0 +1,3 @@ +export const environment = { + production: true +}; diff --git a/core/app/engine/src/environments/environment.ts b/core/app/engine/src/environments/environment.ts new file mode 100644 index 000000000..b7f639aec --- /dev/null +++ b/core/app/engine/src/environments/environment.ts @@ -0,0 +1,8 @@ +// The file contents for the current environment will overwrite these during build. +// The build system defaults to the dev environment which uses `environment.ts`, but if you do +// `ng build --env=prod` then `environment.prod.ts` will be used instead. +// The list of which env maps to which file can be found in `.angular-cli.json`. + +export const environment = { + production: false +}; diff --git a/core/app/engine/src/favicon.ico b/core/app/engine/src/favicon.ico new file mode 100644 index 000000000..8081c7cea Binary files /dev/null and b/core/app/engine/src/favicon.ico differ diff --git a/core/app/engine/src/index.html b/core/app/engine/src/index.html new file mode 100644 index 000000000..a32c71027 --- /dev/null +++ b/core/app/engine/src/index.html @@ -0,0 +1,20 @@ + + + + + + SuiteCRM + + + + + + + + + + + + + + diff --git a/core/app/engine/src/main.ts b/core/app/engine/src/main.ts new file mode 100644 index 000000000..8463f57fb --- /dev/null +++ b/core/app/engine/src/main.ts @@ -0,0 +1,13 @@ +import {enableProdMode} from '@angular/core'; +import {platformBrowserDynamic} from '@angular/platform-browser-dynamic'; + +import {AppModule} from './app/app.module'; +import {environment} from './environments/environment'; + +if (environment.production) { + enableProdMode(); +} + +platformBrowserDynamic() + .bootstrapModule(AppModule) + .catch(err => console.log(err)); diff --git a/core/app/engine/src/polyfills.ts b/core/app/engine/src/polyfills.ts new file mode 100644 index 000000000..396cc342a --- /dev/null +++ b/core/app/engine/src/polyfills.ts @@ -0,0 +1,60 @@ +// tslint:disable +/** + * This file includes polyfills needed by Angular and is loaded before the app. + * You can add your own extra polyfills to this file. + * + * This file is divided into 2 sections: + * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. + * 2. Application imports. Files imported after ZoneJS that should be loaded before your main + * file. + * + * The current setup is for so-called "evergreen" browsers; the last versions of browsers that + * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera), + * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile. + * + * Learn more in https://angular.io/docs/ts/latest/guide/browser-support.html + */ + +/*************************************************************************************************** + * BROWSER POLYFILLS + */ + +/** IE9, IE10 and IE11 requires all of the following polyfills. **/ +// import 'core-js/es6/symbol'; +// import 'core-js/es6/object'; +// import 'core-js/es6/function'; +// import 'core-js/es6/parse-int'; +// import 'core-js/es6/parse-float'; +// import 'core-js/es6/number'; +// import 'core-js/es6/math'; +// import 'core-js/es6/string'; +// import 'core-js/es6/date'; +// import 'core-js/es6/array'; +// import 'core-js/es6/regexp'; +// import 'core-js/es6/map'; +// import 'core-js/es6/weak-map'; +// import 'core-js/es6/set'; + +/** IE10 and IE11 requires the following for NgClass support on SVG elements */ +// import 'classlist.js'; // Run `npm install --save classlist.js`. + +/** IE10 and IE11 requires the following for the Reflect API. */ +// import 'core-js/es6/reflect'; + +/** Evergreen browsers require these. **/ +// Used for reflect-metadata in JIT. If you use AOT (and only Angular decorators), you can remove. + +/** + * Required to support Web Animations `@angular/platform-browser/animations`. + * Needed for: All but Chrome, Firefox and Opera. http://caniuse.com/#feat=web-animation + **/ +// import 'web-animations-js'; // Run `npm install --save web-animations-js`. + +/*************************************************************************************************** + * Zone JS is required by default for Angular itself. + */ +import 'zone.js/dist/zone'; // Included with Angular CLI. + +/*************************************************************************************************** + * APPLICATION IMPORTS + */ diff --git a/core/app/engine/src/test.ts b/core/app/engine/src/test.ts new file mode 100644 index 000000000..850a66ea1 --- /dev/null +++ b/core/app/engine/src/test.ts @@ -0,0 +1,34 @@ +// tslint:disable +// This file is required by karma.conf.js and loads recursively all the .spec and framework files + +import 'zone.js/dist/long-stack-trace-zone'; +import 'zone.js/dist/proxy.js'; +import 'zone.js/dist/sync-test'; +import 'zone.js/dist/jasmine-patch'; +import 'zone.js/dist/async-test'; +import 'zone.js/dist/fake-async-test'; +import {getTestBed} from '@angular/core/testing'; +import { + BrowserDynamicTestingModule, + platformBrowserDynamicTesting +} from '@angular/platform-browser-dynamic/testing'; + +// Unfortunately there's no typing for the `__karma__` variable. Just declare it as any. +declare const __karma__: any; +declare const require: any; + +// Prevent Karma from running prematurely. +__karma__.loaded = function () { +}; + +// First, initialize the Angular testing environment. +getTestBed().initTestEnvironment( + BrowserDynamicTestingModule, + platformBrowserDynamicTesting() +); +// Then we find all the tests. +const context = require.context('./', true, /\.spec\.ts$/); +// And load the modules. +context.keys().map(context); +// Finally, start Karma to run the tests. +__karma__.start(); diff --git a/core/app/engine/src/tsconfig.app.json b/core/app/engine/src/tsconfig.app.json new file mode 100644 index 000000000..190fd300b --- /dev/null +++ b/core/app/engine/src/tsconfig.app.json @@ -0,0 +1,11 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "outDir": "../out-tsc/app", + "types": [] + }, + "exclude": [ + "test.ts", + "**/*.spec.ts" + ] +} diff --git a/core/app/engine/src/tsconfig.spec.json b/core/app/engine/src/tsconfig.spec.json new file mode 100644 index 000000000..7518a5339 --- /dev/null +++ b/core/app/engine/src/tsconfig.spec.json @@ -0,0 +1,20 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "outDir": "../out-tsc/spec", + "baseUrl": "./", + "target": "es5", + "types": [ + "jasmine", + "node" + ] + }, + "files": [ + "test.ts", + "polyfills.ts" + ], + "include": [ + "**/*.spec.ts", + "**/*.d.ts" + ] +} diff --git a/core/app/engine/src/typings.d.ts b/core/app/engine/src/typings.d.ts new file mode 100644 index 000000000..c9059e9a8 --- /dev/null +++ b/core/app/engine/src/typings.d.ts @@ -0,0 +1,6 @@ +/* SystemJS module definition */ +declare var module: NodeModule; + +interface NodeModule { + id: string; +} diff --git a/core/app/engine/svgbuild.js b/core/app/engine/svgbuild.js new file mode 100644 index 000000000..5dc6346bc --- /dev/null +++ b/core/app/engine/svgbuild.js @@ -0,0 +1,101 @@ +var fs = require('fs'); + +// TODO: oop refactoring: use classes +function print(msg) { + process.stdout.write(msg); +} + +function printbk(msg) { + print(msg + '\r'); +} + + +function println(msg) { + print(msg + '\n'); +} + +function clearln() { + process.stdout.clearLine(); +} + +function errorout(err) { + console.error('ERROR: ', err); +} + + +String.prototype.replaceAll = function (search, replacement) { + var target = this; + return target.replace(new RegExp(search, 'g'), replacement); +}; + +class Spinner { + constructor() { + this.chars = '|/-\\'; + this.pos = 0; + } + + next() { + this.pos++; + if (this.pos >= this.chars.length) { + this.pos = 0; + } + return this.chars[this.pos]; + } +} + +function sleep(ms) { + return new Promise(resolve => setTimeout(resolve, ms)); +} + +// ---- starting point + +async function doit() { + + try { + + var folder = process.argv[2]; + if (!folder) { + throw Error('Folder parameter is not set!'); + } + var template = process.argv[3]; + if (!template) { + throw Error('Template file as a parameter is not set!'); + } + + println('Processing svg files from folder `' + folder + '` into angular component template: ' + template + '\r\n'); + + if (fs.existsSync(template)) { + println(template + ' file already exists, making a backup..'); + fs.copyFileSync(template, template + '.bak'); + fs.unlinkSync(template); + } + files = fs.readdirSync(folder); + + spinner = new Spinner(); + for (var i = 0; i < files.length; i++) { + clearln(); + printbk('Processing files (' + (i + 1) + '/' + files.length + '): [' + spinner.next() + '] ' + files[i]); + var cnt = + '\n\n' + + (fs.readFileSync(folder + files[i], 'utf-8') + .replace(/^\s*\<\?xml\s+(.*)\?\>/i, '') + .replaceAll(/\s+id\s*\=\s*\"/i, ' class="') + .replaceAll(/](.|\n|\r)*<\/style>/i, '') + .replaceAll(/](.|\n|\r)*<\/title>/i, '') + .replaceAll(/](.|\n|\r)*<\/desc>/i, '') + ) + + '\n\n'; + fs.appendFileSync(template, cnt); + // await sleep(100); + } + clearln(); + println('Template created.\nDone.\n'); + + } catch (err) { + errorout(err); + } + + +} + +doit(); diff --git a/core/app/engine/tsconfig.json b/core/app/engine/tsconfig.json new file mode 100644 index 000000000..1586adc9a --- /dev/null +++ b/core/app/engine/tsconfig.json @@ -0,0 +1,33 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "paths": { + "*": [ + "types/*" + ], + "core-js/es7/reflect": [ + "node_modules/core-js/proposals/reflect-metadata" + ], + "core-js/es6/*": [ + "node_modules/core-js/es" + ] + }, + "baseUrl": "./", + "outDir": "./dist/out-tsc", + "sourceMap": true, + "declaration": false, + "module": "esnext", + "moduleResolution": "node", + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "importHelpers": true, + "target": "es2015", + "typeRoots": [ + "node_modules/@types" + ], + "lib": [ + "es2018", + "dom" + ] + } +} diff --git a/core/app/engine/tslint.json b/core/app/engine/tslint.json new file mode 100644 index 000000000..868ecba0d --- /dev/null +++ b/core/app/engine/tslint.json @@ -0,0 +1,75 @@ +{ + "extends": "tslint:recommended", + "rulesDirectory": [ + "codelyzer" + ], + "rules": { + "array-type": false, + "arrow-parens": false, + "deprecation": { + "severity": "warn" + }, + "import-blacklist": [ + true, + "rxjs/Rx" + ], + "interface-name": false, + "max-classes-per-file": false, + "max-line-length": [ + true, + 140 + ], + "member-access": false, + "member-ordering": [ + true, + { + "order": [ + "static-field", + "instance-field", + "static-method", + "instance-method" + ] + } + ], + "no-consecutive-blank-lines": false, + "no-console": [ + true, + "debug", + "info", + "time", + "timeEnd", + "trace" + ], + "no-empty": false, + "no-inferrable-types": [ + true, + "ignore-params" + ], + "no-non-null-assertion": true, + "no-redundant-jsdoc": true, + "no-switch-case-fall-through": true, + "no-use-before-declare": true, + "no-var-requires": false, + "object-literal-key-quotes": [ + true, + "as-needed" + ], + "object-literal-sort-keys": false, + "ordered-imports": false, + "quotemark": [ + true, + "single" + ], + "trailing-comma": false, + "no-output-on-prefix": true, + "use-input-property-decorator": true, + "use-output-property-decorator": true, + "use-host-property-decorator": true, + "no-input-rename": true, + "no-output-rename": true, + "use-life-cycle-interface": true, + "use-pipe-transform-interface": true, + "component-class-suffix": true, + "directive-class-suffix": true + } +} diff --git a/core/app/fields/address/address.php b/core/app/fields/address/address.php new file mode 100644 index 000000000..063883911 --- /dev/null +++ b/core/app/fields/address/address.php @@ -0,0 +1,3 @@ + { + let component: AddressListFieldsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [AddressListFieldsComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(AddressListFieldsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/core/app/fields/address/templates/list/address.component.ts b/core/app/fields/address/templates/list/address.component.ts new file mode 100644 index 000000000..01c013c7e --- /dev/null +++ b/core/app/fields/address/templates/list/address.component.ts @@ -0,0 +1,17 @@ +import {Component, OnInit} from '@angular/core'; + +@Component({ + selector: 'scrm-address-list', + templateUrl: './address.component.html', + styleUrls: [] +}) +export class AddressListFieldsComponent implements OnInit { + data: any = []; + + constructor() { + } + + ngOnInit() { + } + +} \ No newline at end of file diff --git a/core/app/fields/assignedusername/assignedusername.php b/core/app/fields/assignedusername/assignedusername.php new file mode 100644 index 000000000..ff99bc439 --- /dev/null +++ b/core/app/fields/assignedusername/assignedusername.php @@ -0,0 +1,3 @@ + { + let component: AssignedusernameListViewComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [AssignedusernameListViewComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(AssignedusernameListViewComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/core/app/fields/assignedusername/templates/list/assignedusername.component.ts b/core/app/fields/assignedusername/templates/list/assignedusername.component.ts new file mode 100644 index 000000000..eb977a1c1 --- /dev/null +++ b/core/app/fields/assignedusername/templates/list/assignedusername.component.ts @@ -0,0 +1,17 @@ +import {Component, OnInit} from '@angular/core'; + +@Component({ + selector: 'scrm-assignedusername-list', + templateUrl: './assignedusername.component.html', + styleUrls: [] +}) +export class AssignedusernameListFieldsComponent implements OnInit { + data: any = []; + + constructor() { + } + + ngOnInit() { + } + +} \ No newline at end of file diff --git a/core/app/fields/boolean/boolean.php b/core/app/fields/boolean/boolean.php new file mode 100644 index 000000000..d546de0b4 --- /dev/null +++ b/core/app/fields/boolean/boolean.php @@ -0,0 +1,3 @@ + { + let component: BooleanListFieldsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [BooleanListFieldsComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(BooleanListFieldsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/core/app/fields/boolean/templates/list/boolean.component.ts b/core/app/fields/boolean/templates/list/boolean.component.ts new file mode 100644 index 000000000..274c8d2ce --- /dev/null +++ b/core/app/fields/boolean/templates/list/boolean.component.ts @@ -0,0 +1,18 @@ +import {Component, OnInit} from '@angular/core'; + +@Component({ + selector: 'scrm-boolean-list', + templateUrl: './boolean.component.html', + styleUrls: [] +}) +export class BooleanListFieldsComponent implements OnInit { + + data: any = []; + + constructor() { + } + + ngOnInit() { + } + +} \ No newline at end of file diff --git a/core/app/fields/boolean/templates/record/boolean.component.html b/core/app/fields/boolean/templates/record/boolean.component.html new file mode 100644 index 000000000..52a1241ca --- /dev/null +++ b/core/app/fields/boolean/templates/record/boolean.component.html @@ -0,0 +1,3 @@ + diff --git a/core/app/fields/boolean/templates/record/boolean.component.spec.ts b/core/app/fields/boolean/templates/record/boolean.component.spec.ts new file mode 100644 index 000000000..006b6631b --- /dev/null +++ b/core/app/fields/boolean/templates/record/boolean.component.spec.ts @@ -0,0 +1,25 @@ +import {async, ComponentFixture, TestBed} from '@angular/core/testing'; + +import {BooleanComponent} from './boolean.component'; + +describe('BooleanComponent', () => { + let component: BooleanComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [BooleanComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(BooleanComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/core/app/fields/boolean/templates/record/boolean.component.ts b/core/app/fields/boolean/templates/record/boolean.component.ts new file mode 100644 index 000000000..89e6f72f1 --- /dev/null +++ b/core/app/fields/boolean/templates/record/boolean.component.ts @@ -0,0 +1,16 @@ +import {Component, OnInit} from '@angular/core'; + +@Component({ + selector: 'scrm-boolean-record', + templateUrl: './boolean.component.html', + styleUrls: [] +}) +export class BooleanRecordFieldsComponent implements OnInit { + + constructor() { + } + + ngOnInit() { + } + +} \ No newline at end of file diff --git a/core/app/fields/button/button.php b/core/app/fields/button/button.php new file mode 100644 index 000000000..d8de93c4e --- /dev/null +++ b/core/app/fields/button/button.php @@ -0,0 +1,3 @@ + { + let component: ButtonListFieldsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ButtonListFieldsComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ButtonListFieldsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/core/app/fields/button/templates/list/button.component.ts b/core/app/fields/button/templates/list/button.component.ts new file mode 100644 index 000000000..3ba72403d --- /dev/null +++ b/core/app/fields/button/templates/list/button.component.ts @@ -0,0 +1,18 @@ +import {Component, OnInit} from '@angular/core'; + +@Component({ + selector: 'scrm-button-list', + templateUrl: './button.component.html', + styleUrls: [] +}) +export class ButtonListFieldsComponent implements OnInit { + + data: any = []; + + constructor() { + } + + ngOnInit() { + } + +} \ No newline at end of file diff --git a/core/app/fields/button/templates/record/button.component.html b/core/app/fields/button/templates/record/button.component.html new file mode 100644 index 000000000..8e8881766 --- /dev/null +++ b/core/app/fields/button/templates/record/button.component.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core/app/fields/button/templates/record/button.component.spec.ts b/core/app/fields/button/templates/record/button.component.spec.ts new file mode 100644 index 000000000..9fc4b9bca --- /dev/null +++ b/core/app/fields/button/templates/record/button.component.spec.ts @@ -0,0 +1,21 @@ +import {async, ComponentFixture, TestBed} from '@angular/core/testing'; + +import {ButtonRecordFieldsComponent} from './button.component'; + +describe('ButtonRecordFieldsComponent', () => { + let component: ButtonRecordFieldsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ButtonRecordFieldsComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ButtonRecordFieldsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); +}); diff --git a/core/app/fields/button/templates/record/button.component.ts b/core/app/fields/button/templates/record/button.component.ts new file mode 100644 index 000000000..9efdf90e0 --- /dev/null +++ b/core/app/fields/button/templates/record/button.component.ts @@ -0,0 +1,16 @@ +import {Component, OnInit} from '@angular/core'; + +@Component({ + selector: 'scrm-button-list', + templateUrl: './button.component.html', + styleUrls: [] +}) +export class ButtonRecordFieldsComponent implements OnInit { + + constructor() { + } + + ngOnInit() { + } + +} \ No newline at end of file diff --git a/core/app/fields/collection/collection.php b/core/app/fields/collection/collection.php new file mode 100644 index 000000000..3ea93c921 --- /dev/null +++ b/core/app/fields/collection/collection.php @@ -0,0 +1,3 @@ + { + let component: CollectionListViewComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [CollectionListViewComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(CollectionListViewComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/core/app/fields/collection/templates/list/collection.component.ts b/core/app/fields/collection/templates/list/collection.component.ts new file mode 100644 index 000000000..d8df5f167 --- /dev/null +++ b/core/app/fields/collection/templates/list/collection.component.ts @@ -0,0 +1,17 @@ +import {Component, OnInit} from '@angular/core'; + +@Component({ + selector: 'scrm-collection-list', + templateUrl: './collection.component.html', + styleUrls: [] +}) +export class CollectionListFieldsComponent implements OnInit { + data: any = []; + + constructor() { + } + + ngOnInit() { + } + +} \ No newline at end of file diff --git a/core/app/fields/cronschedule/cronschedule.php b/core/app/fields/cronschedule/cronschedule.php new file mode 100644 index 000000000..fe4ac6aa5 --- /dev/null +++ b/core/app/fields/cronschedule/cronschedule.php @@ -0,0 +1,3 @@ + { + let component: CronscheduleListFieldsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [CronscheduleListFieldsComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(CronscheduleListFieldsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/core/app/fields/cronschedule/templates/list/cronschedule.component.ts b/core/app/fields/cronschedule/templates/list/cronschedule.component.ts new file mode 100644 index 000000000..43b676c31 --- /dev/null +++ b/core/app/fields/cronschedule/templates/list/cronschedule.component.ts @@ -0,0 +1,17 @@ +import {Component, OnInit} from '@angular/core'; + +@Component({ + selector: 'scrm-cronschedule-list', + templateUrl: './cronschedule.component.html', + styleUrls: [] +}) +export class CronscheduleListFieldsComponent implements OnInit { + data: any = []; + + constructor() { + } + + ngOnInit() { + } + +} \ No newline at end of file diff --git a/core/app/fields/currency/currency.php b/core/app/fields/currency/currency.php new file mode 100644 index 000000000..8f009cf5f --- /dev/null +++ b/core/app/fields/currency/currency.php @@ -0,0 +1,3 @@ + { + let component: CurrencyListFieldsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [CurrencyListFieldsComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(CurrencyListFieldsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/core/app/fields/currency/templates/list/currency.component.ts b/core/app/fields/currency/templates/list/currency.component.ts new file mode 100644 index 000000000..148d991b1 --- /dev/null +++ b/core/app/fields/currency/templates/list/currency.component.ts @@ -0,0 +1,18 @@ +import {Component, OnInit} from '@angular/core'; + +@Component({ + selector: 'scrm-currency-list', + templateUrl: './currency.component.html', + styleUrls: [] +}) +export class CurrencyListFieldsComponent implements OnInit { + + data: any = []; + + constructor() { + } + + ngOnInit() { + } + +} \ No newline at end of file diff --git a/core/app/fields/currency/templates/record/currency.component.html b/core/app/fields/currency/templates/record/currency.component.html new file mode 100644 index 000000000..a32bf5f73 --- /dev/null +++ b/core/app/fields/currency/templates/record/currency.component.html @@ -0,0 +1,3 @@ + diff --git a/core/app/fields/currency/templates/record/currency.component.spec.ts b/core/app/fields/currency/templates/record/currency.component.spec.ts new file mode 100644 index 000000000..9411ab52c --- /dev/null +++ b/core/app/fields/currency/templates/record/currency.component.spec.ts @@ -0,0 +1,25 @@ +import {async, ComponentFixture, TestBed} from '@angular/core/testing'; + +import {CurrencyRecordFieldsComponent} from './currency.component'; + +describe('CurrencyRecordFieldsComponent', () => { + let component: CurrencyRecordFieldsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [CurrencyRecordFieldsComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(CurrencyRecordFieldsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/core/app/fields/currency/templates/record/currency.component.ts b/core/app/fields/currency/templates/record/currency.component.ts new file mode 100644 index 000000000..329c82372 --- /dev/null +++ b/core/app/fields/currency/templates/record/currency.component.ts @@ -0,0 +1,16 @@ +import {Component, OnInit} from '@angular/core'; + +@Component({ + selector: 'scrm-currency-record', + templateUrl: './currency.component.html', + styleUrls: [] +}) +export class CurrencyRecordFieldsComponent implements OnInit { + + constructor() { + } + + ngOnInit() { + } + +} \ No newline at end of file diff --git a/core/app/fields/date/date.php b/core/app/fields/date/date.php new file mode 100644 index 000000000..d4b9cba0f --- /dev/null +++ b/core/app/fields/date/date.php @@ -0,0 +1,3 @@ + { + let component: DateListFieldsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [DateListFieldsComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(DateListFieldsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); +}); diff --git a/core/app/fields/date/templates/list/date.component.ts b/core/app/fields/date/templates/list/date.component.ts new file mode 100644 index 000000000..df8f0b169 --- /dev/null +++ b/core/app/fields/date/templates/list/date.component.ts @@ -0,0 +1,17 @@ +import {Component, OnInit} from '@angular/core'; + +@Component({ + selector: 'scrm-date-list', + templateUrl: './date.component.html', + styleUrls: [] +}) +export class DateListFieldsComponent implements OnInit { + data: any = []; + + constructor() { + } + + ngOnInit() { + } + +} \ No newline at end of file diff --git a/core/app/fields/datetime/datetime.php b/core/app/fields/datetime/datetime.php new file mode 100644 index 000000000..97c784121 --- /dev/null +++ b/core/app/fields/datetime/datetime.php @@ -0,0 +1,3 @@ + { + let component: DatetimeListFieldsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [DatetimeListFieldsComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(DatetimeListFieldsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/core/app/fields/datetime/templates/list/datetime.component.ts b/core/app/fields/datetime/templates/list/datetime.component.ts new file mode 100644 index 000000000..84e4ca053 --- /dev/null +++ b/core/app/fields/datetime/templates/list/datetime.component.ts @@ -0,0 +1,17 @@ +import {Component, OnInit} from '@angular/core'; + +@Component({ + selector: 'scrm-datetime-list', + templateUrl: './datetime.component.html', + styleUrls: [] +}) +export class DatetimeListFieldsComponent implements OnInit { + data: any = {}; + + constructor() { + } + + ngOnInit() { + } + +} \ No newline at end of file diff --git a/core/app/fields/datetimecombo/datetimecombo.php b/core/app/fields/datetimecombo/datetimecombo.php new file mode 100644 index 000000000..e5eb70912 --- /dev/null +++ b/core/app/fields/datetimecombo/datetimecombo.php @@ -0,0 +1,3 @@ + { + let component: DatetimecomboListFieldsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [DatetimecomboListFieldsComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(DatetimecomboListFieldsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/core/app/fields/datetimecombo/templates/list/datetimecombo.component.ts b/core/app/fields/datetimecombo/templates/list/datetimecombo.component.ts new file mode 100644 index 000000000..7a4c2724a --- /dev/null +++ b/core/app/fields/datetimecombo/templates/list/datetimecombo.component.ts @@ -0,0 +1,17 @@ +import {Component, OnInit} from '@angular/core'; + +@Component({ + selector: 'scrm-datetimecombo-list', + templateUrl: './datetimecombo.component.html', + styleUrls: [] +}) +export class DatetimecomboListFieldsComponent implements OnInit { + data: any = []; + + constructor() { + } + + ngOnInit() { + } + +} \ No newline at end of file diff --git a/core/app/fields/default/default.php b/core/app/fields/default/default.php new file mode 100644 index 000000000..c48ae25f2 --- /dev/null +++ b/core/app/fields/default/default.php @@ -0,0 +1,3 @@ + { + let component: DefaultListFieldsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [DefaultListFieldsComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(DefaultListFieldsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/core/app/fields/default/templates/list/default.component.ts b/core/app/fields/default/templates/list/default.component.ts new file mode 100644 index 000000000..a93543614 --- /dev/null +++ b/core/app/fields/default/templates/list/default.component.ts @@ -0,0 +1,17 @@ +import {Component, OnInit} from '@angular/core'; + +@Component({ + selector: 'scrm-default-list', + templateUrl: './default.component.html', + styleUrls: [] +}) +export class DefaultListFieldsComponent implements OnInit { + data: any = []; + + constructor() { + } + + ngOnInit() { + } + +} \ No newline at end of file diff --git a/core/app/fields/download/download.php b/core/app/fields/download/download.php new file mode 100644 index 000000000..ee832a398 --- /dev/null +++ b/core/app/fields/download/download.php @@ -0,0 +1,3 @@ + { + let component: DownloadListFieldsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [DownloadListFieldsComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(DownloadListFieldsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/core/app/fields/download/templates/list/download.component.ts b/core/app/fields/download/templates/list/download.component.ts new file mode 100644 index 000000000..da3a9dcc9 --- /dev/null +++ b/core/app/fields/download/templates/list/download.component.ts @@ -0,0 +1,17 @@ +import {Component, OnInit} from '@angular/core'; + +@Component({ + selector: 'scrm-download-list', + templateUrl: './download.component.html', + styleUrls: [] +}) +export class DownloadListFieldsComponent implements OnInit { + data: any = []; + + constructor() { + } + + ngOnInit() { + } + +} \ No newline at end of file diff --git a/core/app/fields/dynamicnumber/dynamicnumber.php b/core/app/fields/dynamicnumber/dynamicnumber.php new file mode 100644 index 000000000..2bdb7d571 --- /dev/null +++ b/core/app/fields/dynamicnumber/dynamicnumber.php @@ -0,0 +1,3 @@ + { + let component: DynamicnumberListFieldsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [DynamicnumberListFieldsComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(DynamicnumberListFieldsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/core/app/fields/dynamicnumber/templates/list/dynamicnumber.component.ts b/core/app/fields/dynamicnumber/templates/list/dynamicnumber.component.ts new file mode 100644 index 000000000..371dccd64 --- /dev/null +++ b/core/app/fields/dynamicnumber/templates/list/dynamicnumber.component.ts @@ -0,0 +1,17 @@ +import {Component, OnInit} from '@angular/core'; + +@Component({ + selector: 'scrm-dynamicnumber-list', + templateUrl: './dynamicnumber.component.html', + styleUrls: [] +}) +export class DynamicnumberListFieldsComponent implements OnInit { + data: any = []; + + constructor() { + } + + ngOnInit() { + } + +} \ No newline at end of file diff --git a/core/app/fields/emailbody/emailbody.php b/core/app/fields/emailbody/emailbody.php new file mode 100644 index 000000000..95c5ddd23 --- /dev/null +++ b/core/app/fields/emailbody/emailbody.php @@ -0,0 +1,3 @@ + { + let component: EmailbodyListFieldsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [EmailbodyListFieldsComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(EmailbodyListFieldsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/core/app/fields/emailbody/templates/list/emailbody.component.ts b/core/app/fields/emailbody/templates/list/emailbody.component.ts new file mode 100644 index 000000000..ab47e1557 --- /dev/null +++ b/core/app/fields/emailbody/templates/list/emailbody.component.ts @@ -0,0 +1,17 @@ +import {Component, OnInit} from '@angular/core'; + +@Component({ + selector: 'scrm-emailbody-list', + templateUrl: './emailbody.component.html', + styleUrls: [] +}) +export class EmailbodyListFieldsComponent implements OnInit { + data: any = []; + + constructor() { + } + + ngOnInit() { + } + +} \ No newline at end of file diff --git a/core/app/fields/enum/enum.php b/core/app/fields/enum/enum.php new file mode 100644 index 000000000..123441daf --- /dev/null +++ b/core/app/fields/enum/enum.php @@ -0,0 +1,3 @@ + { + let component: EnumListViewComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [EnumListViewComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(EnumListViewComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/core/app/fields/enum/templates/list/enum.component.ts b/core/app/fields/enum/templates/list/enum.component.ts new file mode 100644 index 000000000..ba30d7d58 --- /dev/null +++ b/core/app/fields/enum/templates/list/enum.component.ts @@ -0,0 +1,17 @@ +import {Component, OnInit} from '@angular/core'; + +@Component({ + selector: 'scrm-enum-list', + templateUrl: './enum.component.html', + styleUrls: [] +}) +export class EnumListFieldsComponent implements OnInit { + data: any = []; + + constructor() { + } + + ngOnInit() { + } + +} \ No newline at end of file diff --git a/core/app/fields/enum/templates/record/enum.component.html b/core/app/fields/enum/templates/record/enum.component.html new file mode 100644 index 000000000..1d4c46ff3 --- /dev/null +++ b/core/app/fields/enum/templates/record/enum.component.html @@ -0,0 +1,9 @@ + diff --git a/core/app/fields/enum/templates/record/enum.component.spec.ts b/core/app/fields/enum/templates/record/enum.component.spec.ts new file mode 100644 index 000000000..56e727fa6 --- /dev/null +++ b/core/app/fields/enum/templates/record/enum.component.spec.ts @@ -0,0 +1,25 @@ +import {async, ComponentFixture, TestBed} from '@angular/core/testing'; + +import {EnumRecordFieldsComponent} from './enum.component'; + +describe('EnumRecordFieldsComponent', () => { + let component: EnumRecordFieldsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [EnumRecordFieldsComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(EnumRecordFieldsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/core/app/fields/enum/templates/record/enum.component.ts b/core/app/fields/enum/templates/record/enum.component.ts new file mode 100644 index 000000000..6f5dccfc5 --- /dev/null +++ b/core/app/fields/enum/templates/record/enum.component.ts @@ -0,0 +1,16 @@ +import {Component, OnInit} from '@angular/core'; + +@Component({ + selector: 'scrm-enum-record', + templateUrl: './enum.component.html', + styleUrls: [] +}) +export class EnumRecordFieldsComponent implements OnInit { + + constructor() { + } + + ngOnInit() { + } + +} \ No newline at end of file diff --git a/core/app/fields/field.component.spec.ts b/core/app/fields/field.component.spec.ts new file mode 100644 index 000000000..2483668ae --- /dev/null +++ b/core/app/fields/field.component.spec.ts @@ -0,0 +1,31 @@ +import {async, ComponentFixture, TestBed} from '@angular/core/testing'; + +import {PluginManager} from '../../../../plugin-manager/plugin-manager.service'; +import {FieldComponent} from './field.component'; +import {PLUGIN_MANIFESTS} from '../../../../plugin-manager/plugin-manifest'; + + +describe('FieldComponent', () => { + let component: FieldComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [FieldComponent], + providers: [PluginManager] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(FieldComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + // it('should create', () => { + // console.log(component); + + // expect(component).toBeTruthy(); + // }); +}); diff --git a/core/app/fields/field.component.ts b/core/app/fields/field.component.ts new file mode 100644 index 000000000..6ae17534d --- /dev/null +++ b/core/app/fields/field.component.ts @@ -0,0 +1,66 @@ +import { + Component, + OnInit, + Input, + ViewChild, + ViewContainerRef +} from '@angular/core'; + +import {AppManager} from '../../app-manager/app-manager.service'; + +@Component({ + selector: 'scrm-field', + template: ` + + `, + styleUrls: [] +}) +export class FieldComponent implements OnInit { + @ViewChild('fieldOutlet', {read: ViewContainerRef}) + fieldOutlet: ViewContainerRef | undefined; + + id: string; + + @Input('view-type') viewType: string; + @Input('field-type') fieldType: string; + @Input('field-name') fieldName: string; + @Input('field-value') fieldValue: string; + @Input('row') row: any; + + constructor(protected appManager: AppManager) { + } + + ngOnInit() { + this.id = this.makeId(8); + + if (this.fieldType == 'phone') { + this.fieldType = 'varchar'; + } + + if (this.fieldType == 'name') { + this.fieldType = 'varchar'; + } + + let data = { + 'viewType': this.viewType, + 'fieldType': this.fieldType, + 'fieldName': this.fieldName, + 'fieldValue': this.fieldValue, + 'row': JSON.parse(this.row), + }; + + const componentId = 'scrm-' + this.fieldType + '-' + this.viewType; + this.appManager.loadAppComponent(this.fieldOutlet, componentId, data); + } + + makeId(length) { + var result = ''; + var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; + var charactersLength = characters.length; + for (var i = 0; i < length; i++) { + result += characters.charAt(Math.floor(Math.random() * charactersLength)); + } + return result; + } + +} \ No newline at end of file diff --git a/core/app/fields/field.module.ts b/core/app/fields/field.module.ts new file mode 100644 index 000000000..a14e6a23b --- /dev/null +++ b/core/app/fields/field.module.ts @@ -0,0 +1,23 @@ +import {NgModule, CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'; +import {CommonModule} from '@angular/common'; + +import {AppManagerModule, AppManifest} from '../../app-manager/app-manager.module'; +import {FieldComponent} from './field.component'; + +const manifest: AppManifest[] = []; + +@NgModule({ + declarations: [ + FieldComponent, + ], + exports: [ + FieldComponent, + ], + imports: [ + CommonModule, + AppManagerModule.forRoot(manifest) + ], + schemas: [CUSTOM_ELEMENTS_SCHEMA] +}) +export class FieldModule { +} \ No newline at end of file diff --git a/core/app/fields/file/file.php b/core/app/fields/file/file.php new file mode 100644 index 000000000..0e7790dbd --- /dev/null +++ b/core/app/fields/file/file.php @@ -0,0 +1,3 @@ + { + let component: FileListViewComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [FileListViewComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(FileListViewComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/core/app/fields/file/templates/list/file.component.ts b/core/app/fields/file/templates/list/file.component.ts new file mode 100644 index 000000000..71674516c --- /dev/null +++ b/core/app/fields/file/templates/list/file.component.ts @@ -0,0 +1,17 @@ +import {Component, OnInit} from '@angular/core'; + +@Component({ + selector: 'scrm-file-list', + templateUrl: './file.component.html', + styleUrls: [] +}) +export class FileListFieldsComponent implements OnInit { + data: any = []; + + constructor() { + } + + ngOnInit() { + } + +} \ No newline at end of file diff --git a/core/app/fields/float/float.php b/core/app/fields/float/float.php new file mode 100644 index 000000000..a3cc70ad0 --- /dev/null +++ b/core/app/fields/float/float.php @@ -0,0 +1,3 @@ + { + let component: FloatListViewComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [FloatListViewComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(FloatListFieldsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/core/app/fields/float/templates/list/float.component.ts b/core/app/fields/float/templates/list/float.component.ts new file mode 100644 index 000000000..d5a006b5b --- /dev/null +++ b/core/app/fields/float/templates/list/float.component.ts @@ -0,0 +1,17 @@ +import {Component, OnInit} from '@angular/core'; + +@Component({ + selector: 'scrm-float-list', + templateUrl: './float.component.html', + styleUrls: [] +}) +export class FloatListFieldsComponent implements OnInit { + data: any = []; + + constructor() { + } + + ngOnInit() { + } + +} \ No newline at end of file diff --git a/core/app/fields/float/templates/record/float.component.html b/core/app/fields/float/templates/record/float.component.html new file mode 100644 index 000000000..5d1b02259 --- /dev/null +++ b/core/app/fields/float/templates/record/float.component.html @@ -0,0 +1,3 @@ +
+ {{ form.fields }} +
\ No newline at end of file diff --git a/core/app/fields/float/templates/record/float.component.spec.ts b/core/app/fields/float/templates/record/float.component.spec.ts new file mode 100644 index 000000000..94fc97de9 --- /dev/null +++ b/core/app/fields/float/templates/record/float.component.spec.ts @@ -0,0 +1,21 @@ +import {async, ComponentFixture, TestBed} from '@angular/core/testing'; + +import {FloatRecordViewComponent} from './float.component'; + +describe('FloatRecordViewComponent', () => { + let component: FloatRecordViewComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [FloatRecordViewComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(FloatRecordViewComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); +}); diff --git a/core/app/fields/float/templates/record/float.component.ts b/core/app/fields/float/templates/record/float.component.ts new file mode 100644 index 000000000..be3b30e5d --- /dev/null +++ b/core/app/fields/float/templates/record/float.component.ts @@ -0,0 +1,16 @@ +import {Component, OnInit} from '@angular/core'; + +@Component({ + selector: 'scrm-float-record', + templateUrl: './float.component.html', + styleUrls: [] +}) +export class FloatRecordFieldsComponent implements OnInit { + + constructor() { + } + + ngOnInit() { + } + +} \ No newline at end of file diff --git a/core/app/fields/fullname/fullname.php b/core/app/fields/fullname/fullname.php new file mode 100644 index 000000000..ff8032090 --- /dev/null +++ b/core/app/fields/fullname/fullname.php @@ -0,0 +1,3 @@ + { + let component: FullnameListFieldsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [FullnameListFieldsComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(FullnameListFieldsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/core/app/fields/fullname/templates/list/fullname.component.ts b/core/app/fields/fullname/templates/list/fullname.component.ts new file mode 100644 index 000000000..83c4f2828 --- /dev/null +++ b/core/app/fields/fullname/templates/list/fullname.component.ts @@ -0,0 +1,17 @@ +import {Component, OnInit} from '@angular/core'; + +@Component({ + selector: 'scrm-fullname-list', + templateUrl: './fullname.component.html', + styleUrls: [] +}) +export class FullnameListFieldsComponent implements OnInit { + data: any = []; + + constructor() { + } + + ngOnInit() { + } + +} \ No newline at end of file diff --git a/core/app/fields/int/int.php b/core/app/fields/int/int.php new file mode 100644 index 000000000..16cd0d16c --- /dev/null +++ b/core/app/fields/int/int.php @@ -0,0 +1,3 @@ + { + let component: IntListFieldsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [IntListFieldsComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(IntListFieldsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/core/app/fields/int/templates/list/int.component.ts b/core/app/fields/int/templates/list/int.component.ts new file mode 100644 index 000000000..9b88fc1fe --- /dev/null +++ b/core/app/fields/int/templates/list/int.component.ts @@ -0,0 +1,17 @@ +import {Component, OnInit} from '@angular/core'; + +@Component({ + selector: 'scrm-int-list', + templateUrl: './int.component.html', + styleUrls: [] +}) +export class IntListFieldsComponent implements OnInit { + data: any = []; + + constructor() { + } + + ngOnInit() { + } + +} \ No newline at end of file diff --git a/core/app/fields/int/templates/record/int.component.html b/core/app/fields/int/templates/record/int.component.html new file mode 100644 index 000000000..d403c4abd --- /dev/null +++ b/core/app/fields/int/templates/record/int.component.html @@ -0,0 +1,3 @@ + diff --git a/core/app/fields/int/templates/record/int.component.spec.ts b/core/app/fields/int/templates/record/int.component.spec.ts new file mode 100644 index 000000000..938ffe583 --- /dev/null +++ b/core/app/fields/int/templates/record/int.component.spec.ts @@ -0,0 +1,25 @@ +import {async, ComponentFixture, TestBed} from '@angular/core/testing'; + +import {IntComponent} from './int.component'; + +describe('IntComponent', () => { + let component: IntComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [IntComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(IntRecordFieldsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/core/app/fields/int/templates/record/int.component.ts b/core/app/fields/int/templates/record/int.component.ts new file mode 100644 index 000000000..401d77e24 --- /dev/null +++ b/core/app/fields/int/templates/record/int.component.ts @@ -0,0 +1,16 @@ +import {Component, OnInit} from '@angular/core'; + +@Component({ + selector: 'scrm-int', + templateUrl: './int.component.html', + styleUrls: [] +}) +export class IntRecordFieldsComponent implements OnInit { + + constructor() { + } + + ngOnInit() { + } + +} \ No newline at end of file diff --git a/core/app/fields/multienum/multienum.php b/core/app/fields/multienum/multienum.php new file mode 100644 index 000000000..b9bc741ac --- /dev/null +++ b/core/app/fields/multienum/multienum.php @@ -0,0 +1,3 @@ + { + let component: MultiEnumListFieldsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [MultiEnumListFieldsComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(MultiEnumListFieldsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/core/app/fields/multienum/templates/list/multienum.component.ts b/core/app/fields/multienum/templates/list/multienum.component.ts new file mode 100644 index 000000000..5d5d6a886 --- /dev/null +++ b/core/app/fields/multienum/templates/list/multienum.component.ts @@ -0,0 +1,17 @@ +import {Component, OnInit} from '@angular/core'; + +@Component({ + selector: 'scrm-multienum-list', + templateUrl: './multienum.component.html', + styleUrls: [] +}) +export class MultienumListFieldsComponent implements OnInit { + data: any = []; + + constructor() { + } + + ngOnInit() { + } + +} \ No newline at end of file diff --git a/core/app/fields/multienum/templates/record/multienum.component.html b/core/app/fields/multienum/templates/record/multienum.component.html new file mode 100644 index 000000000..1d4c46ff3 --- /dev/null +++ b/core/app/fields/multienum/templates/record/multienum.component.html @@ -0,0 +1,9 @@ + diff --git a/core/app/fields/multienum/templates/record/multienum.component.spec.ts b/core/app/fields/multienum/templates/record/multienum.component.spec.ts new file mode 100644 index 000000000..c5f964dc2 --- /dev/null +++ b/core/app/fields/multienum/templates/record/multienum.component.spec.ts @@ -0,0 +1,25 @@ +import {async, ComponentFixture, TestBed} from '@angular/core/testing'; + +import {MultienumRecordFieldsComponent} from './multienum.component'; + +describe('MultienumRecordFieldsComponent', () => { + let component: MultienumRecordFieldsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [MultienumRecordFieldsComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(MultienumRecordFieldsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/core/app/fields/multienum/templates/record/multienum.component.ts b/core/app/fields/multienum/templates/record/multienum.component.ts new file mode 100644 index 000000000..d83c2eb60 --- /dev/null +++ b/core/app/fields/multienum/templates/record/multienum.component.ts @@ -0,0 +1,16 @@ +import {Component, OnInit} from '@angular/core'; + +@Component({ + selector: 'scrm-multienum-record', + templateUrl: './multienum.component.html', + styleUrls: [] +}) +export class MultienumRecordFieldsComponent implements OnInit { + + constructor() { + } + + ngOnInit() { + } + +} \ No newline at end of file diff --git a/core/app/fields/password/password.php b/core/app/fields/password/password.php new file mode 100644 index 000000000..f2c2a9bcc --- /dev/null +++ b/core/app/fields/password/password.php @@ -0,0 +1,3 @@ + { + let component: PasswordListFieldsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [PasswordListFieldsComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(PasswordListFieldsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/core/app/fields/password/templates/list/password.component.ts b/core/app/fields/password/templates/list/password.component.ts new file mode 100644 index 000000000..f5b3aa6cb --- /dev/null +++ b/core/app/fields/password/templates/list/password.component.ts @@ -0,0 +1,17 @@ +import {Component, OnInit} from '@angular/core'; + +@Component({ + selector: 'scrm-password-list', + templateUrl: './password.component.html', + styleUrls: [] +}) +export class PasswordListFieldsComponent implements OnInit { + data: any = []; + + constructor() { + } + + ngOnInit() { + } + +} \ No newline at end of file diff --git a/core/app/fields/password/templates/record/password.component.html b/core/app/fields/password/templates/record/password.component.html new file mode 100644 index 000000000..279cd6dbf --- /dev/null +++ b/core/app/fields/password/templates/record/password.component.html @@ -0,0 +1,9 @@ +
+ + +
\ No newline at end of file diff --git a/core/app/fields/password/templates/record/password.component.spec.ts b/core/app/fields/password/templates/record/password.component.spec.ts new file mode 100644 index 000000000..ed59287af --- /dev/null +++ b/core/app/fields/password/templates/record/password.component.spec.ts @@ -0,0 +1,21 @@ +import {async, ComponentFixture, TestBed} from '@angular/core/testing'; + +import {PasswordRecordFieldsComponent} from './password.component'; + +describe('PasswordRecordFieldsComponent', () => { + let component: PasswordRecordFieldsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [PasswordRecordFieldsComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(PasswordRecordFieldsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); +}); diff --git a/core/app/fields/password/templates/record/password.component.ts b/core/app/fields/password/templates/record/password.component.ts new file mode 100644 index 000000000..f2184a6ff --- /dev/null +++ b/core/app/fields/password/templates/record/password.component.ts @@ -0,0 +1,16 @@ +import {Component, OnInit} from '@angular/core'; + +@Component({ + selector: 'scrm-password-record', + templateUrl: './password.component.html', + styleUrls: [] +}) +export class PasswordRecordFieldsComponent implements OnInit { + + constructor() { + } + + ngOnInit() { + } + +} \ No newline at end of file diff --git a/core/app/fields/relate/relate.php b/core/app/fields/relate/relate.php new file mode 100644 index 000000000..1e34cfbe8 --- /dev/null +++ b/core/app/fields/relate/relate.php @@ -0,0 +1,3 @@ +{{ data.fieldValue }} diff --git a/core/app/fields/relate/templates/list/relate.component.spec.ts b/core/app/fields/relate/templates/list/relate.component.spec.ts new file mode 100644 index 000000000..9fa971164 --- /dev/null +++ b/core/app/fields/relate/templates/list/relate.component.spec.ts @@ -0,0 +1,21 @@ +import {async, ComponentFixture, TestBed} from '@angular/core/testing'; + +import {RelateListFieldsComponent} from './relate.component'; + +describe('RelateListFieldsComponent', () => { + let component: RelateListFieldsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [RelateListFieldsComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(RelateListFieldsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); +}); diff --git a/core/app/fields/relate/templates/list/relate.component.ts b/core/app/fields/relate/templates/list/relate.component.ts new file mode 100644 index 000000000..4438458b1 --- /dev/null +++ b/core/app/fields/relate/templates/list/relate.component.ts @@ -0,0 +1,29 @@ +import {Component, OnInit} from '@angular/core'; + +@Component({ + selector: 'scrm-relate-list', + templateUrl: './relate.component.html', + styleUrls: [] +}) +export class RelateListFieldsComponent implements OnInit { + data: any = {}; + link = '#/'; + + constructor() { + } + + ngOnInit() { + } + + ngAfterViewChecked() { + //console.log('dbg: [RelateListViewModule.ngAfterViewChecked]', this.data); + this.link = '#/' + (this.data && this.data.fieldName && this.data.row && this.data.row.field_name_map && + this.data.row.field_name_map[this.data.fieldName] && this.data.row.field_name_map[this.data.fieldName].module ? + this.data.row.field_name_map[this.data.fieldName].module : '') + '/DetailView/' + (this.data && this.data.row && + this.data.row.field_name_map && this.data.row.field_name_map[this.data.fieldName] && + this.data.row.field_name_map[this.data.fieldName].id_name && + this.data.row[this.data.row.field_name_map[this.data.fieldName].id_name] ? + this.data.row[this.data.row.field_name_map[this.data.fieldName].id_name] : ''); + } + +} \ No newline at end of file diff --git a/core/app/fields/relate/templates/record/relate.component.html b/core/app/fields/relate/templates/record/relate.component.html new file mode 100644 index 000000000..a32bf5f73 --- /dev/null +++ b/core/app/fields/relate/templates/record/relate.component.html @@ -0,0 +1,3 @@ + diff --git a/core/app/fields/relate/templates/record/relate.component.spec.ts b/core/app/fields/relate/templates/record/relate.component.spec.ts new file mode 100644 index 000000000..3af14dc14 --- /dev/null +++ b/core/app/fields/relate/templates/record/relate.component.spec.ts @@ -0,0 +1,25 @@ +import {async, ComponentFixture, TestBed} from '@angular/core/testing'; + +import {RelateRecordFieldsComponent} from './relate.component'; + +describe('RelateRecordFieldsComponent', () => { + let component: RelateRecordFieldsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [RelateRecordFieldsComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(RelateRecordFieldsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/core/app/fields/relate/templates/record/relate.component.ts b/core/app/fields/relate/templates/record/relate.component.ts new file mode 100644 index 000000000..fc0a521da --- /dev/null +++ b/core/app/fields/relate/templates/record/relate.component.ts @@ -0,0 +1,16 @@ +import {Component, OnInit} from '@angular/core'; + +@Component({ + selector: 'scrm-relate', + templateUrl: './relate.component.html', + styleUrls: [] +}) +export class RelateRecordFieldsComponent implements OnInit { + + constructor() { + } + + ngOnInit() { + } + +} \ No newline at end of file diff --git a/core/app/fields/submit/submit.php b/core/app/fields/submit/submit.php new file mode 100644 index 000000000..be8801a2f --- /dev/null +++ b/core/app/fields/submit/submit.php @@ -0,0 +1,3 @@ + { + let component: SubmitListFieldsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [SubmitListFieldsComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SubmitListFieldsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/core/app/fields/submit/templates/list/submit.component.ts b/core/app/fields/submit/templates/list/submit.component.ts new file mode 100644 index 000000000..5ea77cdf5 --- /dev/null +++ b/core/app/fields/submit/templates/list/submit.component.ts @@ -0,0 +1,18 @@ +import {Component, OnInit, Input} from '@angular/core'; + +@Component({ + selector: 'scrm-submit-list', + templateUrl: './submit.component.html', + styleUrls: [] +}) +export class SubmitListFieldsComponent implements OnInit { + + data: any = []; + + constructor() { + } + + ngOnInit() { + } + +} \ No newline at end of file diff --git a/core/app/fields/submit/templates/record/submit.component.html b/core/app/fields/submit/templates/record/submit.component.html new file mode 100644 index 000000000..b0befe196 --- /dev/null +++ b/core/app/fields/submit/templates/record/submit.component.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core/app/fields/submit/templates/record/submit.component.spec.ts b/core/app/fields/submit/templates/record/submit.component.spec.ts new file mode 100644 index 000000000..1c0f4472d --- /dev/null +++ b/core/app/fields/submit/templates/record/submit.component.spec.ts @@ -0,0 +1,25 @@ +import {async, ComponentFixture, TestBed} from '@angular/core/testing'; + +import {SubmitRecordFieldsComponent} from './submit.component'; + +describe('SubmitRecordFieldsComponent', () => { + let component: SubmitRecordFieldsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [SubmitRecordFieldsComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SubmitRecordFieldsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/core/app/fields/submit/templates/record/submit.component.ts b/core/app/fields/submit/templates/record/submit.component.ts new file mode 100644 index 000000000..6c10088c6 --- /dev/null +++ b/core/app/fields/submit/templates/record/submit.component.ts @@ -0,0 +1,16 @@ +import {Component, OnInit} from '@angular/core'; + +@Component({ + selector: 'scrm-submit-record', + templateUrl: './submit.component.html', + styleUrls: [] +}) +export class SubmitRecordFieldsComponent implements OnInit { + + constructor() { + } + + ngOnInit() { + } + +} \ No newline at end of file diff --git a/core/app/fields/varchar/templates/list/varchar.component.html b/core/app/fields/varchar/templates/list/varchar.component.html new file mode 100644 index 000000000..6e5d3d834 --- /dev/null +++ b/core/app/fields/varchar/templates/list/varchar.component.html @@ -0,0 +1 @@ +{{ data.fieldValue }} diff --git a/core/app/fields/varchar/templates/list/varchar.component.spec.ts b/core/app/fields/varchar/templates/list/varchar.component.spec.ts new file mode 100644 index 000000000..b22a820c7 --- /dev/null +++ b/core/app/fields/varchar/templates/list/varchar.component.spec.ts @@ -0,0 +1,25 @@ +import {async, ComponentFixture, TestBed} from '@angular/core/testing'; + +import {VarcharListFieldsComponent} from './varchar.component'; + +describe('VarcharListFieldsComponent', () => { + let component: VarcharListFieldsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [VarcharListFieldsComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(VarcharListFieldsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/core/app/fields/varchar/templates/list/varchar.component.ts b/core/app/fields/varchar/templates/list/varchar.component.ts new file mode 100644 index 000000000..0fc5f6c5d --- /dev/null +++ b/core/app/fields/varchar/templates/list/varchar.component.ts @@ -0,0 +1,35 @@ +import {Component, OnInit} from '@angular/core'; + +@Component({ + selector: 'scrm-varchar-list', + templateUrl: './varchar.component.html', + styleUrls: [] +}) +export class VarcharListFieldsComponent implements OnInit { + + data: any = {}; + link = '#'; + class = 'text'; + + constructor() { + } + + ngOnInit() { + } + + ngAfterViewChecked() { + //console.log('dbg: [VarcharListViewComponent.ngAfterViewChecked]', this.data); + if (this.data && this.data.fieldName && this.data.fieldName == 'name') { + this.link = '#/' + this.data.row.module_name + '/DetailView/' + this.data.row.id; + this.class = 'name'; + // this.link = '#/' + (this.data && this.data.fieldName && this.data.row && this.data.row.field_name_map && + // this.data.row.field_name_map[this.data.fieldName] && this.data.row.field_name_map[this.data.fieldName].module ? + // this.data.row.field_name_map[this.data.fieldName].module : '') + '/DetailView/' + (this.data && this.data.row && + // this.data.row.field_name_map && this.data.row.field_name_map[this.data.fieldName] && + // this.data.row.field_name_map[this.data.fieldName].id_name && + // this.data.row[this.data.row.field_name_map[this.data.fieldName].id_name] ? + // this.data.row[this.data.row.field_name_map[this.data.fieldName].id_name] : ''); + } + } + +} \ No newline at end of file diff --git a/core/app/fields/varchar/templates/record/varchar.component.html b/core/app/fields/varchar/templates/record/varchar.component.html new file mode 100644 index 000000000..de3a0430e --- /dev/null +++ b/core/app/fields/varchar/templates/record/varchar.component.html @@ -0,0 +1,10 @@ +
+ + +
\ No newline at end of file diff --git a/core/app/fields/varchar/templates/record/varchar.component.spec.ts b/core/app/fields/varchar/templates/record/varchar.component.spec.ts new file mode 100644 index 000000000..7913a038e --- /dev/null +++ b/core/app/fields/varchar/templates/record/varchar.component.spec.ts @@ -0,0 +1,21 @@ +import {async, ComponentFixture, TestBed} from '@angular/core/testing'; + +import {VarcharRecordFieldsComponent} from './varchar.component'; + +describe('VarcharRecordFieldsComponent', () => { + let component: VarcharRecordFieldsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [VarcharRecordFieldsComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(VarcharRecordFieldsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); +}); diff --git a/core/app/fields/varchar/templates/record/varchar.component.ts b/core/app/fields/varchar/templates/record/varchar.component.ts new file mode 100644 index 000000000..cc49e996a --- /dev/null +++ b/core/app/fields/varchar/templates/record/varchar.component.ts @@ -0,0 +1,16 @@ +import {Component, OnInit} from '@angular/core'; + +@Component({ + selector: 'scrm-varchar-record', + templateUrl: './varchar.component.html', + styleUrls: [] +}) +export class VarcharRecordFieldsComponent implements OnInit { + + constructor() { + } + + ngOnInit() { + } + +} \ No newline at end of file diff --git a/core/app/fields/varchar/varchar.php b/core/app/fields/varchar/varchar.php new file mode 100644 index 000000000..fb15953ad --- /dev/null +++ b/core/app/fields/varchar/varchar.php @@ -0,0 +1,3 @@ + svg { + margin: 0.3em 0.8em 0.8em 0; +} + +.action-btn-icon { + svg { + width: 1.2em; + height: 1.2em; + } +} + +.action-btn-icon svg path, +.global-links svg path { + fill: $white; +} + +.navbar-toggler:hover svg path { + stroke: $salmon-pink; +} + +.close-navmenu svg polygon { + fill: $light-grey; +} + +.close-navmenu svg { + margin: 0 0.3em 0 0; +} + +.back-to-top svg { + width: 1em; + height: 1em; + margin: 0 0.5em; +} + +.back-to-top svg polygon { + fill: $midnight-grey; +} + +.login-form { + svg { + width: 1.2em; + height: 1.2em; + margin: 1em; + + path, + polygon, + rect { + fill: $powdered-blue; + } + } +} + +.list-view-settings svg { + fill: $white; + margin: 0 0.5em 0 0; + vertical-align: middle; +} + +.sort-icon { + fill: $light-grey; + margin: 0 0.2em; +} + +.pagination-icons { + fill: $white; + margin: 0.2em; +} + +.widget-close-icon svg { + fill: $white; + cursor: pointer; +} + +.widget-button-icon { + fill: $white; + margin: 0 0.5em 0 0; + vertical-align: middle; +} + +.remove-button svg { + fill: $sky-blue; +} + +.expand-table-row svg { + fill: $sky-blue; +} + +.modal .close svg { + fill: $white; +} + +.info-icon { + margin: 0 0 0 0.5em; +} + +.info-icon svg circle { + fill: $white; +} + +.info-icon svg path { + fill: $dusty-grey; +} + +.create-popup-arrow svg { + width: 1.2em; +} + +.create-popup-cross svg { + width: 0.75em; + height: 0.75em; +} + +.create-popup-arrow svg polygon, +.create-popup-cross svg polygon, +.create-popup-calendar svg * { + fill: #c3c1c9; +} + +@media all and (min-width: $breakpoint-large) { + button svg { + vertical-align: -0.2em; + display: inline-block; + } +} + +.list-data-icon { + margin: 0; + padding: 0; +} + +.list-data-icon svg { + fill: #aa9dcc; + margin: 0; + padding: 0; +} + +.back-top-icon { + vertical-align: middle; + margin: 0; + padding: 0; +} + +.responsive-menu-toggler svg path { + fill: $white; +} diff --git a/core/app/themes/suite8/css/layout/_actionbar.scss b/core/app/themes/suite8/css/layout/_actionbar.scss new file mode 100644 index 000000000..33df4215d --- /dev/null +++ b/core/app/themes/suite8/css/layout/_actionbar.scss @@ -0,0 +1,30 @@ +/* --------- ACTION BAR SECTION ---------- */ + +.global-action-bar { + clear: both; + margin-top: 3.1em; + background-color: $light-grey; +} + +@media all and (max-width: $breakpoint-small) { + .global-action-bar .col, + .global-action-bar .col-6 { + margin: 0; + padding: 0; + } + .global-action-bar .action-group { + margin: 0.3em 0.3em 0.3em 0; + } + + .global-action-bar .global-search { + margin: 0.3em; + padding: 0; + } +} + +.action-view-all { + font-style: italic; + font-weight: 300; + float: right; + font-size: 0.9em; +} diff --git a/core/app/themes/suite8/css/layout/_common.scss b/core/app/themes/suite8/css/layout/_common.scss new file mode 100644 index 000000000..98d748ba8 --- /dev/null +++ b/core/app/themes/suite8/css/layout/_common.scss @@ -0,0 +1,59 @@ +/* --------- COMMON SECTION ---------- */ + +body { + height: 100%; + margin: 0; + padding: 0; + border: none; + background: $off-white; +} + +/*
 tags shows up in a well separated visible format at a high z-index */
+pre {
+  font-family: monospace;
+  font-size: 1em;
+  background: black;
+  border: gray;
+  color: lightgreen;
+  z-index: 100000;
+}
+
+/* width */
+::-webkit-scrollbar {
+  width: 0.8em;
+}
+
+/* Track */
+::-webkit-scrollbar-track {
+  background: $dusky-blue;
+}
+
+/* Handle */
+::-webkit-scrollbar-thumb {
+  background: $midnight-blue;
+}
+
+/* Handle on hover */
+::-webkit-scrollbar-thumb:hover {
+  background: $midnight-blue;
+}
+
+.navbar-nav a:not([href]):not([tabindex]), .global-links a:not([href]):not([tabindex]) {
+  color: $light-grey;
+}
+
+.navbar-nav a:not([href]):not([tabindex]):focus,
+.navbar-nav a:not([href]):not([tabindex]):hover,
+.global-links a:not([href]):not([tabindex]):focus,
+.global-links a:not([href]):not([tabindex]):hover {
+  color: $salmon-pink;
+  -webkit-transition: color 0.5s ease-out;
+  -moz-transition: color 0.5s ease-out;
+  -o-transition: color 0.5s ease-out;
+  transition: color 0.5s ease-out;
+  cursor: pointer;
+}
+
+iframe {
+  padding-top: 7em;
+}
\ No newline at end of file
diff --git a/core/app/themes/suite8/css/layout/_footer.scss b/core/app/themes/suite8/css/layout/_footer.scss
new file mode 100644
index 000000000..bb221c617
--- /dev/null
+++ b/core/app/themes/suite8/css/layout/_footer.scss
@@ -0,0 +1,89 @@
+.footer a {
+  font-size: 0.8em;
+}
+
+.footer-link {
+  color: $midnight-grey;
+  cursor: pointer;
+  margin: 0 0.5em;
+  font-size: 1em;
+}
+
+a.footer-link:not([href]):not([tabindex]) {
+  color: $midnight-grey;
+}
+
+.footer-link:hover {
+  color: $median-grey;
+  text-decoration: none;
+}
+
+.back-to-top .footer-link {
+  text-transform: uppercase;
+  font-size: 0.75em;
+  vertical-align: middle;
+  cursor: pointer;
+}
+
+@media all and (min-width: $breakpoint-medium) {
+  .footer {
+    position: fixed;
+    left: 0;
+    bottom: 0;
+    padding: 0 1.85em;
+    width: 100%;
+    height: 3.1em;
+    line-height: 3.1em;
+    background-color: $light-grey;
+    color: $midnight-blue;
+  }
+
+  .copyright-links {
+    float: left;
+    line-height: 3.1em;
+  }
+
+  .back-to-top {
+    margin: 0 0.5em 0 0;
+    padding: 0;
+    float: right;
+    line-height: 3.1em;
+  }
+}
+
+@media all and (max-width: $breakpoint-medium) {
+  .copyright-links {
+    float: left;
+    width: 60%;
+    padding: 0.5em 0 0 0.25em;
+  }
+
+  .back-to-top {
+    margin: 0 0.5em 0 0;
+    padding: 0;
+    float: right;
+    line-height: 3.1em;
+    width: 35%;
+  }
+
+  .back-to-top .footer-link {
+    float: right;
+    margin: 0;
+  }
+
+  .footer {
+    left: 0;
+    bottom: 0;
+    padding: 0;
+    width: 100%;
+    height: 3.1em;
+    background-color: $light-grey;
+    color: $midnight-blue;
+    margin: 0;
+  }
+
+  .footer-link {
+    display: block;
+    float: left;
+  }
+}
diff --git a/core/app/themes/suite8/css/layout/_forms.scss b/core/app/themes/suite8/css/layout/_forms.scss
new file mode 100644
index 000000000..d6338390a
--- /dev/null
+++ b/core/app/themes/suite8/css/layout/_forms.scss
@@ -0,0 +1,32 @@
+/* --------- FORM SECTION ---------- */
+
+
+.login-form {
+  @media all and (min-width: $breakpoint-xsmall) {
+    text-align: center;
+    width: 25em;
+    margin: 20% auto;
+  }
+
+  @media all and (max-width: $breakpoint-xsmall) {
+    text-align: center;
+    margin: 5% auto;
+    position: absolute;
+    width: 95%;
+    top: 25%;
+  }
+
+  img {
+    margin-bottom: 1.3em;
+  }
+
+  .forgotten-password {
+    text-align: center;
+    margin: 0.2em 0 0 0;
+  }
+
+  .forgotten-password-link {
+    clear: both;
+    color: $salmon-pink;
+  }
+}
diff --git a/core/app/themes/suite8/css/layout/_listview.scss b/core/app/themes/suite8/css/layout/_listview.scss
new file mode 100644
index 000000000..f6ef99cfe
--- /dev/null
+++ b/core/app/themes/suite8/css/layout/_listview.scss
@@ -0,0 +1,371 @@
+.list-view {
+  padding-top: 7em;
+  width: 100%;
+  margin: 0;
+}
+
+.list-view-header {
+  border-bottom: 0.03em solid $light-grey;
+}
+
+.list-view-title {
+  color: $shell-grey;
+  font-size: 1.8em;
+  font-weight: 300;
+  margin: 1em;
+  letter-spacing: 0.1em;
+  text-transform: uppercase;
+}
+
+.list-view-actions {
+  margin: 1em 0 0 0;
+}
+
+.list-view-container {
+  margin: 1em 0 4em 0;
+  font-size: 0.85em;
+}
+
+.list-view-widget {
+  margin-right: 1.5em;
+}
+
+.widget {
+  background-color: $white;
+  border: 0.1em solid $light-grey;
+}
+
+.widget-header {
+  background-color: $midnight-blue;
+  -webkit-border-top-left-radius: 0.3em;
+  -webkit-border-top-right-radius: 0.3em;
+  -moz-border-radius-topleft: 0.3em;
+  -moz-border-radius-topright: 0.3em;
+  border-top-left-radius: 0.3em;
+  border-top-right-radius: 0.3em;
+
+  h3 {
+    color: $white;
+    font-size: 1.2em;
+    margin: 0;
+    padding: 0.8em;
+  }
+}
+
+.list-view-table {
+  margin: 0;
+}
+
+.table-wrapper {
+  overflow-x: auto;
+  overflow-y: hidden;
+}
+
+.table-header {
+  -webkit-border-top-left-radius: 0.3em;
+  -webkit-border-top-right-radius: 0.3em;
+  -moz-border-radius-topleft: 0.3em;
+  -moz-border-radius-topright: 0.3em;
+  border-top-left-radius: 0.3em;
+  border-top-right-radius: 0.3em;
+}
+
+.table-footer {
+  -webkit-border-bottom-right-radius: 0.3em;
+  -webkit-border-bottom-left-radius: 0.3em;
+  -moz-border-radius-bottomright: 0.3em;
+  -moz-border-radius-bottomleft: 0.3em;
+  border-bottom-right-radius: 0.3em;
+  border-bottom-left-radius: 0.3em;
+}
+
+.list-view-tableactions {
+  background-color: $cool-blue;
+  padding: 0.2em;
+}
+
+.list-view-table thead {
+  background-color: $nepal-grey;
+  color: $white;
+}
+
+.list-view-table td {
+  color: $median-grey;
+}
+
+.bulk-action {
+  color: $white;
+}
+
+.list-view-table a {
+  color: $burnt-red;
+  font-weight: bold;
+}
+
+.pipeline-chart,
+.donut-chart {
+  margin: 0 0.5em;
+}
+
+.pipeline-chart-content,
+.donut-chart-content {
+  margin: 1.5em 0;
+}
+
+.chart-create {
+  margin: 1em 0;
+}
+
+@media all and (max-width: $breakpoint-xlarge) {
+  .list-view-widget {
+    margin: 1.5em 0;
+  }
+}
+
+@media all and (max-width: $breakpoint-large) {
+  table {
+    table-layout: fixed;
+  }
+  td {
+    word-wrap: break-word;
+  }
+  tbody,
+  tr {
+    display: block;
+    width: 100%;
+  }
+
+  .responsive-table-row th {
+    margin: 0;
+    padding: 1em 1em 0 1em;
+  }
+
+  .responsive-table-row td {
+    margin: 0;
+    padding: 0 1em 1em 1em;
+  }
+
+  .responsive-table td {
+    border: none;
+  }
+
+  .hide-pagination-count {
+    display: none;
+  }
+
+  .responsive-table-row th,
+  .responsive-table-row td {
+    word-wrap: break-word;
+  }
+
+  .list-view-table th,
+  .list-view-table td {
+    word-wrap: break-word;
+  }
+
+  .hide-table-header,
+  .hide-table-rows {
+    display: none;
+  }
+
+  .show-collapsed-header,
+  .show-collapsed-rows {
+    display: none;
+  }
+
+  .expand-table-row {
+    margin: 0 2em;
+    cursor: pointer;
+  }
+
+  .table-striped .responsive-top-row,
+  .table-striped tbody tr:nth-of-type(odd).responsive-top-row {
+    background-color: $sky-blue;
+    -webkit-border-top-left-radius: 0.3em;
+    -webkit-border-top-right-radius: 0.3em;
+    -moz-border-radius-topleft: 0.3em;
+    -moz-border-radius-topright: 0.3em;
+    border-top-left-radius: 0.3em;
+    border-top-right-radius: 0.3em;
+  }
+
+  .responsive-top-row a {
+    color: $white;
+  }
+
+  .first-table-data {
+    background-color: $sky-blue;
+  }
+
+  .responsive-table-row td,
+  .responsive-table-row th {
+    background-color: #edecf0;
+    color: $midnight-blue;
+  }
+
+  .responsive-table th {
+    background-image: linear-gradient(to right, $midnight-grey 10%, rgba(255, 255, 255, 0) 0%);
+    background-position: top;
+    background-size: 5px 1px;
+    background-repeat: repeat-x;
+  }
+
+  tr.responsive-table-row {
+    background-color: #edecf0;
+  }
+
+  .primary-table-header {
+    background-color: $nepal-grey;
+    color: $white;
+  }
+
+  .list-view-table thead th {
+    border: none;
+  }
+
+  .display-block-table th,
+  .display-block-table td {
+    display: block;
+    width: 100%;
+  }
+
+  .responsive-table-toggler {
+    text-align: right;
+    width: 100%;
+    cursor: pointer;
+  }
+
+  .table td {
+    border: none;
+  }
+
+  td.list-group-icon {
+    margin: 0;
+    padding: 0.75rem 0;
+    display: inline;
+  }
+  .list-view-title {
+    margin: 0.5em 1em;
+  }
+
+  .list-view-table .row {
+    margin-left: 1em;
+    margin-right: 1em;
+  }
+
+  .list-view-header .row {
+    padding-left: 0;
+    padding-right: 0;
+    margin-left: 0.9em;
+    margin-right: 0.9em;
+  }
+
+  .list-view-header .col {
+    padding-left: 0;
+    padding-right: 0;
+    margin-left: 0;
+    margin-right: 0;
+  }
+}
+
+.primary-table-header {
+  background-color: $nepal-grey;
+  color: $white;
+  white-space: nowrap;
+}
+
+.primary-table-header span {
+  font-weight: bold;
+}
+
+.primary-table-header span:hover {
+  text-decoration: underline;
+  cursor: pointer;
+}
+
+td.list-group-icon {
+  margin: 0;
+  padding: 0.75rem 0;
+}
+
+.responsive-table-row.display-block-table {
+  border-left: 0.1em solid #aa9dcc;
+  border-right: 0.1em solid #aa9dcc;
+  margin: 0 0 0.5em 0;
+  -webkit-border-bottom-right-radius: 0.25em;
+  -webkit-border-bottom-left-radius: 0.25em;
+  -moz-border-radius-bottomright: 0.25em;
+  -moz-border-radius-bottomleft: 0.25em;
+  border-bottom-right-radius: 0.25em;
+  border-bottom-left-radius: 0.25em;
+}
+
+@media all and (max-width: $breakpoint-large) {
+  .checkbox-container {
+    padding: 0 0.25rem;
+  }
+  th.show-table-rows {
+    padding: 0 1rem;
+  }
+}
+
+.responsive-top-row .responsive-header-link {
+  background-image: linear-gradient(to right, $white 30%, rgba(255, 255, 255, 0) 0%);
+  background-position: bottom;
+  background-size: 5px 1px;
+  background-repeat: repeat-x;
+  text-decoration: none;
+}
+
+.display-block-table th:not(:first-child) {
+  background-image: linear-gradient(to right, $midnight-grey 10%, rgba(255, 255, 255, 0) 0%);
+  background-position: top;
+  background-size: 5px 1px;
+  background-repeat: repeat-x;
+}
+
+.display-block-table td,
+.display-block-table th {
+  border: none;
+}
+
+.primary-table-data {
+  width: 100%;
+}
+
+td {
+  word-wrap: break-word;
+}
+
+.select-action-group {
+  margin: 0 0 0 0.5em;
+  color: $white;
+}
+
+.select-action-group .dropdown-toggle::after,
+.bulk-action-group,
+.bulk-action-group .dropdown-toggle::after {
+  color: $white;
+}
+
+@media all and (min-width: $breakpoint-medium) {
+  .bulk-action {
+    margin-left: 0.5em;
+  }
+}
+
+.pagination-count {
+  vertical-align: text-bottom;
+  margin: 0 0.3em;
+  font-weight: bold;
+}
+
+.list-view .col-lg-12, .list-view .col-lg-9, .list-view .col-lg-3 {
+  transition-timing-function: ease;
+  /* Quick on the way out */
+  transition: 0.5s;
+  -webkit-transition: all .5s ease;
+  -moz-transition: all .5s ease;
+  -o-transition: all .5s ease;
+  transition: all .5s ease;
+}
\ No newline at end of file
diff --git a/core/app/themes/suite8/css/layout/_modal.scss b/core/app/themes/suite8/css/layout/_modal.scss
new file mode 100644
index 000000000..021378379
--- /dev/null
+++ b/core/app/themes/suite8/css/layout/_modal.scss
@@ -0,0 +1,132 @@
+@media all and (max-width: $breakpoint-xsmall) {
+  .modal-header,
+  .modal-footer {
+    background-color: $dusty-grey;
+  }
+  .modal-body {
+    margin: 0;
+    overflow-y: scroll;
+    max-height: $breakpoint-xsmall;
+  }
+}
+
+@media all and (min-width: $breakpoint-xsmall) and (max-width: $breakpoint-xlarge) {
+  .modal-header,
+  .modal-footer {
+    background-color: $dusty-grey;
+  }
+  .modal-redirect-text {
+    color: $white;
+    font-weight: bold;
+    font-size: 0.8em;
+    margin: 0 0 0 3em;
+  }
+  .modal-body {
+    margin: 0;
+    overflow-y: scroll;
+    max-height: $breakpoint-medium;
+  }
+  .modal-redirect-text {
+    margin: 0 0 0 2.5em;
+  }
+  .modal-options {
+    margin: 0 0 0.5em 0;
+  }
+}
+
+.modal-title {
+  text-align: center;
+  margin: 0 auto;
+  padding: 0;
+  line-height: 0.9em;
+  color: $off-white;
+}
+
+.modal-content {
+  border: none;
+  background-color: $white;
+}
+
+@media all and (min-width: $breakpoint-xlarge) {
+  .modal-body {
+    margin: 1em;
+  }
+
+  .modal-redirect-text {
+    color: $white;
+    font-weight: bold;
+    font-size: 0.8em;
+    margin: 1em 0 0 0;
+  }
+
+  .modal-header,
+  .modal-footer {
+    background-color: $dusty-grey;
+    max-height: 2.7rem;
+  }
+
+  .modal-options {
+    float: left;
+    text-align: right;
+  }
+
+  .modal-buttons {
+    float: right;
+    text-align: right;
+  }
+}
+
+.modal-field-header {
+  background-color: $light-grey;
+  padding: 0.6em 0.7em;
+  -webkit-border-radius: 0.25em;
+  -moz-border-radius: 0.25em;
+  border-radius: 0.25em;
+  color: #534d64;
+  font-size: 1em;
+  letter-spacing: 0.08em;
+}
+
+.modal-backdrop {
+  background-color: #454c53;
+}
+
+.modal-backdrop.show {
+  opacity: 0.9;
+}
+
+.modal-header .close {
+  margin: -0.3em 0;
+  padding: 0;
+  opacity: 1;
+}
+
+.relate-input-group {
+  display: inline;
+}
+
+.modal-redirect-text {
+  color: $white;
+  font-weight: bold;
+  font-size: 0.8em;
+}
+
+/* width */
+.modal-body::-webkit-scrollbar {
+  width: 0.8em;
+}
+
+/* Track */
+.modal-body::-webkit-scrollbar-track {
+  background: $light-grey;
+}
+
+/* Handle */
+.modal-body::-webkit-scrollbar-thumb {
+  background: $dusty-grey;
+}
+
+/* Handle on hover */
+.modal-body::-webkit-scrollbar-thumb:hover {
+  background: $dusty-grey;
+}
diff --git a/core/app/themes/suite8/css/layout/_navbar.scss b/core/app/themes/suite8/css/layout/_navbar.scss
new file mode 100644
index 000000000..519bb9f2b
--- /dev/null
+++ b/core/app/themes/suite8/css/layout/_navbar.scss
@@ -0,0 +1,206 @@
+/* --------- NAVBAR SECTION ---------- */
+
+.navbar {
+  height: 3.1em;
+  background-color: $midnight-blue;
+  padding: 0 1.6em;
+  margin: 0;
+}
+
+@media only screen and (min-width: $breakpoint-large) {
+  .navbar-nav {
+    .main-grouped:hover .dropdown-menu.main,
+    .global-link-item:hover .dropdown-menu,
+    .non-grouped:hover .dropdown-menu {
+      display: block;
+    }
+  }
+
+  .nav-link-grouped,
+  .nav-link-nongrouped {
+    color: $off-white;
+    line-height: 3.1em;
+    padding: 1em 0.5em 1em 0.5em;
+  }
+
+  .nav-link-grouped:hover,
+  .nav-link-nongrouped:hover {
+    color: $light-grey;
+    border-top: 0.2em solid $salmon-pink;
+    padding: 0.8em 0.5em 1em 0.5em;
+    text-decoration: none;
+  }
+}
+
+.home-nav {
+  line-height: 3.1em;
+}
+
+a.home-nav-link {
+  color: $white;
+  line-height: 3.1em;
+  padding: 1em 0.5em 1em 0.5em;
+}
+
+.recent-link scrm-svg-icon-ui > svg {
+  margin: 0.3em 0.8em 0.8em 0;
+}
+
+.recent-link {
+  display: inline;
+  margin: 0;
+  padding: 0;
+}
+
+.nav-link {
+  color: $light-grey;
+}
+
+.nav-link:hover {
+  color: $salmon-pink;
+}
+
+.global-link-item:hover {
+  color: $salmon-pink;
+}
+
+.submenu,
+.globalactions {
+  background-color: $dusky-blue;
+  color: $light-grey;
+  margin: 0;
+  border: 0;
+}
+
+.submenu li {
+  border: 0;
+  padding: 0 0.3em;
+  -webkit-transition: color 0.5s ease-out;
+  -moz-transition: color 0.5s ease-out;
+  -o-transition: color 0.5s ease-out;
+  transition: color 0.5s ease-out;
+}
+
+.nav-menu-icon {
+  width: 1.5em;
+  height: 1.5em;
+}
+
+.action-btn-icon {
+  width: 1.2em;
+  height: 1.2em;
+}
+
+h4.recently-viewed-header {
+  border-top: 0.05em solid darken($light-grey, 20%);
+  color: darken($light-grey, 20%);
+  font-weight: bold;
+  margin: 0.8em 0 0 0;
+  padding: 0.8em;
+  font-size: 0.9em;
+}
+
+.nav-link:hover svg path,
+.nav-link:hover svg polygon {
+  fill: $salmon-pink;
+}
+
+.navbar-1 {
+  float: left;
+  width: 100%;
+}
+
+.navbar-2 {
+  float: right;
+  padding: 0;
+}
+
+@media only screen and (max-width: $breakpoint-large) {
+  .navbar-1,
+  .navbar-2 {
+    padding: 0;
+    margin: 0;
+    float: left;
+    top: 0;
+    z-index: 3;
+  }
+
+  .top-nav .dropdown-toggle::after {
+    display: none;
+  }
+
+  .navbar-header {
+    padding: 0 0.8em;
+  }
+
+  .navbar-toggler {
+    padding: 0.8em 1.6em;
+  }
+
+  .navbar-nav li {
+    padding: 0 1.6em;
+  }
+
+  .nav-link {
+    font-size: 0.85em;
+    color: $white;
+  }
+
+  .nav-link-grouped,
+  .nav-link-nongrouped {
+    color: $off-white;
+    line-height: 3.1em;
+    padding: 0.8em 0.5em 1em 0.5em;
+    font-size: 0.85em;
+  }
+
+  .nav-link-grouped:hover,
+  .nav-link-nongrouped:hover {
+    color: $light-grey;
+    text-decoration: none;
+  }
+  .navbar-nav,
+  .navbar-nav li {
+    border-bottom: 0.05em solid $off-white;
+  }
+
+  .navbar-nav:last-child,
+  .navbar-nav li:last-child {
+    border: none;
+  }
+
+  .top-nav.nav-item:hover {
+    padding: 0 1.6em;
+  }
+
+  .global-action-icon svg {
+    width: 1.5em;
+    height: 1.5em;
+    margin: 0 0.6em 0 0;
+  }
+
+  .global-links .nav-link {
+    font-size: 0.85em;
+    font-weight: bold;
+  }
+
+  .navbar-nav > li > .dropdown-menu,
+  .collapsenav .navbar-nav > li {
+    background-color: $dusky-blue;
+  }
+}
+
+.navbar-toggler:hover svg path {
+  stroke: $salmon-pink;
+}
+
+scrm-logo-ui img {
+  margin: 0.3em;
+  padding-left: 0.5em;
+}
+
+a.nav-link.dropdown-toggle::after,
+a.nav-link-grouped.dropdown-toggle::after,
+a.nav-link-nongrouped.dropdown-toggle::after {
+  vertical-align: middle;
+}
diff --git a/core/app/themes/suite8/css/style.scss b/core/app/themes/suite8/css/style.scss
new file mode 100644
index 000000000..b08ccf403
--- /dev/null
+++ b/core/app/themes/suite8/css/style.scss
@@ -0,0 +1,19 @@
+@import 'base/reset';
+
+@import 'abstracts/functions';
+@import 'abstracts/typography';
+@import 'abstracts/variables';
+
+@import 'components/button';
+@import 'components/checkbox';
+@import 'components/dropdown';
+@import 'components/input';
+@import 'components/svg';
+
+@import 'layout/actionbar';
+@import 'layout/common';
+@import 'layout/footer';
+@import 'layout/forms';
+@import 'layout/listview';
+@import 'layout/modal';
+@import 'layout/navbar';
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/3d_chart.jpeg b/core/app/themes/suite8/images/3d_chart.jpeg
new file mode 100644
index 000000000..e6924fe27
Binary files /dev/null and b/core/app/themes/suite8/images/3d_chart.jpeg differ
diff --git a/core/app/themes/suite8/images/alert_icon.svg b/core/app/themes/suite8/images/alert_icon.svg
new file mode 100644
index 000000000..1d9c12339
--- /dev/null
+++ b/core/app/themes/suite8/images/alert_icon.svg
@@ -0,0 +1,18 @@
+
+
+
+
+    02_alert_icon
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/alert_red.svg b/core/app/themes/suite8/images/alert_red.svg
new file mode 100644
index 000000000..95ba3ccac
--- /dev/null
+++ b/core/app/themes/suite8/images/alert_red.svg
@@ -0,0 +1,18 @@
+
+
+
+
+    08_alert_red
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/arrow_down.svg b/core/app/themes/suite8/images/arrow_down.svg
new file mode 100644
index 000000000..2ab0f7e40
--- /dev/null
+++ b/core/app/themes/suite8/images/arrow_down.svg
@@ -0,0 +1,16 @@
+
+
+
+
+    05_arrow_down
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/arrow_down_filled.svg b/core/app/themes/suite8/images/arrow_down_filled.svg
new file mode 100644
index 000000000..660f04914
--- /dev/null
+++ b/core/app/themes/suite8/images/arrow_down_filled.svg
@@ -0,0 +1,16 @@
+
+
+
+
+    12_arrow_down_blue
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/arrow_down_red.svg b/core/app/themes/suite8/images/arrow_down_red.svg
new file mode 100644
index 000000000..a75ad6300
--- /dev/null
+++ b/core/app/themes/suite8/images/arrow_down_red.svg
@@ -0,0 +1,16 @@
+
+
+
+
+    13_arrow_down_red
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/arrow_left_filled.svg b/core/app/themes/suite8/images/arrow_left_filled.svg
new file mode 100644
index 000000000..813d1ea2b
--- /dev/null
+++ b/core/app/themes/suite8/images/arrow_left_filled.svg
@@ -0,0 +1,16 @@
+
+
+
+
+    12_arrow_left
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/arrow_right.svg b/core/app/themes/suite8/images/arrow_right.svg
new file mode 100644
index 000000000..77d894eeb
--- /dev/null
+++ b/core/app/themes/suite8/images/arrow_right.svg
@@ -0,0 +1,17 @@
+
+
+
+
+    07_arrow_right
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/arrow_right_filled.svg b/core/app/themes/suite8/images/arrow_right_filled.svg
new file mode 100644
index 000000000..168e77a5d
--- /dev/null
+++ b/core/app/themes/suite8/images/arrow_right_filled.svg
@@ -0,0 +1,16 @@
+
+
+
+
+    12_arrow_right
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/arrow_separator.svg b/core/app/themes/suite8/images/arrow_separator.svg
new file mode 100644
index 000000000..94303d37d
--- /dev/null
+++ b/core/app/themes/suite8/images/arrow_separator.svg
@@ -0,0 +1,12 @@
+
+
+
+
+    12_arrow_separator
+    Created with Sketch.
+    
+
diff --git a/core/app/themes/suite8/images/arrow_up_filled.svg b/core/app/themes/suite8/images/arrow_up_filled.svg
new file mode 100644
index 000000000..a3250869f
--- /dev/null
+++ b/core/app/themes/suite8/images/arrow_up_filled.svg
@@ -0,0 +1,16 @@
+
+
+
+
+    12_arrow_up
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/arrow_up_grey.svg b/core/app/themes/suite8/images/arrow_up_grey.svg
new file mode 100644
index 000000000..b1610d218
--- /dev/null
+++ b/core/app/themes/suite8/images/arrow_up_grey.svg
@@ -0,0 +1,16 @@
+
+
+
+
+    02_arrow_up_grey
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/bars_blue.svg b/core/app/themes/suite8/images/bars_blue.svg
new file mode 100644
index 000000000..1a2cefacf
--- /dev/null
+++ b/core/app/themes/suite8/images/bars_blue.svg
@@ -0,0 +1,20 @@
+
+
+
+
+    15_bars_blue
+    Created with Sketch.
+    
+	
+		
+			
+            
+            
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/bars_white.svg b/core/app/themes/suite8/images/bars_white.svg
new file mode 100644
index 000000000..8e99a17f7
--- /dev/null
+++ b/core/app/themes/suite8/images/bars_white.svg
@@ -0,0 +1,20 @@
+
+
+
+
+    15_bars_white
+    Created with Sketch.
+    
+	
+		
+			
+            
+            
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/bug_blue.svg b/core/app/themes/suite8/images/bug_blue.svg
new file mode 100644
index 000000000..1cd4d9621
--- /dev/null
+++ b/core/app/themes/suite8/images/bug_blue.svg
@@ -0,0 +1,45 @@
+
+
+
+
+    15_bug_blue
+    Created with Sketch.
+    
+	
+		
+			
+			
+            
+				
+					
+				
+			
+            
+				
+					
+				
+			
+            
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/bug_white.svg b/core/app/themes/suite8/images/bug_white.svg
new file mode 100644
index 000000000..38ad3b9d3
--- /dev/null
+++ b/core/app/themes/suite8/images/bug_white.svg
@@ -0,0 +1,45 @@
+
+
+
+
+    15_bug_white
+    Created with Sketch.
+    
+	
+		
+			
+			
+            
+				
+					
+				
+			
+            
+				
+					
+				
+			
+            
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/bulb_blue.svg b/core/app/themes/suite8/images/bulb_blue.svg
new file mode 100644
index 000000000..477bf4c8e
--- /dev/null
+++ b/core/app/themes/suite8/images/bulb_blue.svg
@@ -0,0 +1,61 @@
+
+
+
+
+    15_bulb_blue
+    Created with Sketch.
+    
+	
+		
+			
+				
+				
+                
+					
+						
+					
+				
+                
+					
+						
+					
+				
+                
+			
+            
+				
+				
+                
+					
+						
+					
+				
+                
+					
+						
+					
+				
+                
+			
+            
+            
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/bulb_white.svg b/core/app/themes/suite8/images/bulb_white.svg
new file mode 100644
index 000000000..91b098221
--- /dev/null
+++ b/core/app/themes/suite8/images/bulb_white.svg
@@ -0,0 +1,60 @@
+
+
+
+
+    15_bulb_white
+    Created with Sketch.
+    
+	
+		
+			
+				
+				
+                
+					
+						
+					
+				
+                
+					
+						
+					
+				
+                
+			
+            
+				
+				
+                
+					
+						
+					
+				
+                
+					
+						
+					
+				
+                
+			
+            
+            
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/calendar.svg b/core/app/themes/suite8/images/calendar.svg
new file mode 100644
index 000000000..eca6aed64
--- /dev/null
+++ b/core/app/themes/suite8/images/calendar.svg
@@ -0,0 +1,38 @@
+
+
+
+
+    06_calendar
+    Created with Sketch.
+    
+	
+		
+			
+				
+                
+                
+                
+                
+                
+                
+                
+                
+                
+                
+                
+                
+                
+                
+			
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/calendar_dark.svg b/core/app/themes/suite8/images/calendar_dark.svg
new file mode 100644
index 000000000..88ba0fafe
--- /dev/null
+++ b/core/app/themes/suite8/images/calendar_dark.svg
@@ -0,0 +1,31 @@
+
+
+
+
+    17_calendar
+    Created with Sketch.
+    
+	
+		
+			
+            
+            
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/calendar_grey.svg b/core/app/themes/suite8/images/calendar_grey.svg
new file mode 100644
index 000000000..99118a1f5
--- /dev/null
+++ b/core/app/themes/suite8/images/calendar_grey.svg
@@ -0,0 +1,40 @@
+
+
+
+
+    01_calendar_grey
+    Created with Sketch.
+    
+	
+		
+			
+				
+                
+                
+                
+                
+                
+                
+                
+                
+                
+                
+                
+                
+                
+                
+			
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/calendar_hover.svg b/core/app/themes/suite8/images/calendar_hover.svg
new file mode 100644
index 000000000..02f289f87
--- /dev/null
+++ b/core/app/themes/suite8/images/calendar_hover.svg
@@ -0,0 +1,20 @@
+
+
+    
+    17_calendar_hover
+    Created with Sketch.
+    
+    
+        
+            
+                
+                
+                
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/calendar_icon.svg b/core/app/themes/suite8/images/calendar_icon.svg
new file mode 100644
index 000000000..e1c02e98e
--- /dev/null
+++ b/core/app/themes/suite8/images/calendar_icon.svg
@@ -0,0 +1,43 @@
+
+
+
+
+    14_calendar_icon
+    Created with Sketch.
+    
+	
+
+    
+    
+    
+    
+	
+		
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+	
+
+
diff --git a/core/app/themes/suite8/images/calendar_purple.svg b/core/app/themes/suite8/images/calendar_purple.svg
new file mode 100644
index 000000000..36138d218
--- /dev/null
+++ b/core/app/themes/suite8/images/calendar_purple.svg
@@ -0,0 +1,30 @@
+
+
+
+
+    02_calendar_purple
+    Created with Sketch.
+    
+	
+		
+			
+            
+            
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/calendar_purple_hover.svg b/core/app/themes/suite8/images/calendar_purple_hover.svg
new file mode 100644
index 000000000..948598f23
--- /dev/null
+++ b/core/app/themes/suite8/images/calendar_purple_hover.svg
@@ -0,0 +1,20 @@
+
+
+    
+    02_calendar_purple_hover
+    Created with Sketch.
+    
+    
+        
+            
+                
+                
+                
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/calendar_white.svg b/core/app/themes/suite8/images/calendar_white.svg
new file mode 100644
index 000000000..d854fae6e
--- /dev/null
+++ b/core/app/themes/suite8/images/calendar_white.svg
@@ -0,0 +1,36 @@
+
+
+
+
+    12_calendar_white
+    Created with Sketch.
+    
+	
+		
+			
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/calls_icon.svg b/core/app/themes/suite8/images/calls_icon.svg
new file mode 100644
index 000000000..5aa58ee0d
--- /dev/null
+++ b/core/app/themes/suite8/images/calls_icon.svg
@@ -0,0 +1,23 @@
+
+
+
+
+    14_calls_icon
+    Created with Sketch.
+    
+	
+
+    
+    
+    
+    
+
diff --git a/core/app/themes/suite8/images/check_1_a.svg b/core/app/themes/suite8/images/check_1_a.svg
new file mode 100644
index 000000000..66dccf823
--- /dev/null
+++ b/core/app/themes/suite8/images/check_1_a.svg
@@ -0,0 +1,15 @@
+
+
+    
+    check_1_a
+    Created with Sketch.
+    
+    
+        
+            
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/check_1_b.svg b/core/app/themes/suite8/images/check_1_b.svg
new file mode 100644
index 000000000..137236f7c
--- /dev/null
+++ b/core/app/themes/suite8/images/check_1_b.svg
@@ -0,0 +1,14 @@
+
+
+    
+    check_1_b
+    Created with Sketch.
+    
+    
+        
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/check_2_a.svg b/core/app/themes/suite8/images/check_2_a.svg
new file mode 100644
index 000000000..df70e29d5
--- /dev/null
+++ b/core/app/themes/suite8/images/check_2_a.svg
@@ -0,0 +1,15 @@
+
+
+    
+    check_2_a
+    Created with Sketch.
+    
+    
+        
+            
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/check_2_b.svg b/core/app/themes/suite8/images/check_2_b.svg
new file mode 100644
index 000000000..7850bd4f5
--- /dev/null
+++ b/core/app/themes/suite8/images/check_2_b.svg
@@ -0,0 +1,14 @@
+
+
+    
+    check_2_b
+    Created with Sketch.
+    
+    
+        
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/check_2_c.svg b/core/app/themes/suite8/images/check_2_c.svg
new file mode 100644
index 000000000..e12216721
--- /dev/null
+++ b/core/app/themes/suite8/images/check_2_c.svg
@@ -0,0 +1,15 @@
+
+
+    
+    check_2_c
+    Created with Sketch.
+    
+    
+        
+            
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/check_3_a.svg b/core/app/themes/suite8/images/check_3_a.svg
new file mode 100644
index 000000000..82786dfba
--- /dev/null
+++ b/core/app/themes/suite8/images/check_3_a.svg
@@ -0,0 +1,15 @@
+
+
+    
+    check_3_a
+    Created with Sketch.
+    
+    
+        
+            
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/check_3_b.svg b/core/app/themes/suite8/images/check_3_b.svg
new file mode 100644
index 000000000..a7a70aaca
--- /dev/null
+++ b/core/app/themes/suite8/images/check_3_b.svg
@@ -0,0 +1,14 @@
+
+
+    
+    check_3_b
+    Created with Sketch.
+    
+    
+        
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/check_3_c.svg b/core/app/themes/suite8/images/check_3_c.svg
new file mode 100644
index 000000000..8fb0289fc
--- /dev/null
+++ b/core/app/themes/suite8/images/check_3_c.svg
@@ -0,0 +1,15 @@
+
+
+    
+    check_3_c
+    Created with Sketch.
+    
+    
+        
+            
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/check_3_d.svg b/core/app/themes/suite8/images/check_3_d.svg
new file mode 100644
index 000000000..b791ebb62
--- /dev/null
+++ b/core/app/themes/suite8/images/check_3_d.svg
@@ -0,0 +1,14 @@
+
+
+    
+    check_3_d
+    Created with Sketch.
+    
+    
+        
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/clock.svg b/core/app/themes/suite8/images/clock.svg
new file mode 100644
index 000000000..d4b6043af
--- /dev/null
+++ b/core/app/themes/suite8/images/clock.svg
@@ -0,0 +1,39 @@
+
+
+
+
+    12_clock
+    Created with Sketch.
+    
+	
+		
+			
+				
+				
+                
+					
+						
+					
+				
+                
+					
+						
+					
+				
+                
+			
+            
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/clock_large.svg b/core/app/themes/suite8/images/clock_large.svg
new file mode 100644
index 000000000..5c72f28cc
--- /dev/null
+++ b/core/app/themes/suite8/images/clock_large.svg
@@ -0,0 +1,39 @@
+
+
+
+
+    12_clock_large
+    Created with Sketch.
+    
+	
+		
+			
+				
+				
+                
+					
+						
+					
+				
+                
+					
+						
+					
+				
+                
+			
+            
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/cross.svg b/core/app/themes/suite8/images/cross.svg
new file mode 100644
index 000000000..16832f46b
--- /dev/null
+++ b/core/app/themes/suite8/images/cross.svg
@@ -0,0 +1,17 @@
+
+
+
+
+    05_cross
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/cross_grey.svg b/core/app/themes/suite8/images/cross_grey.svg
new file mode 100644
index 000000000..a0935b8b1
--- /dev/null
+++ b/core/app/themes/suite8/images/cross_grey.svg
@@ -0,0 +1,18 @@
+
+
+
+
+    01_cross_grey
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/cross_hover.svg b/core/app/themes/suite8/images/cross_hover.svg
new file mode 100644
index 000000000..fa98e4331
--- /dev/null
+++ b/core/app/themes/suite8/images/cross_hover.svg
@@ -0,0 +1,15 @@
+
+
+    
+    05_cross_hover
+    Created with Sketch.
+    
+    
+        
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/cross_purple.svg b/core/app/themes/suite8/images/cross_purple.svg
new file mode 100644
index 000000000..d8fd93792
--- /dev/null
+++ b/core/app/themes/suite8/images/cross_purple.svg
@@ -0,0 +1,17 @@
+
+
+
+
+    03_cross_purple
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/cross_purple_hover.svg b/core/app/themes/suite8/images/cross_purple_hover.svg
new file mode 100644
index 000000000..74f262710
--- /dev/null
+++ b/core/app/themes/suite8/images/cross_purple_hover.svg
@@ -0,0 +1,15 @@
+
+
+    
+    03_cross_purple_hover
+    Created with Sketch.
+    
+    
+        
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/cross_thin.svg b/core/app/themes/suite8/images/cross_thin.svg
new file mode 100644
index 000000000..a70e2065a
--- /dev/null
+++ b/core/app/themes/suite8/images/cross_thin.svg
@@ -0,0 +1,20 @@
+
+
+
+
+    06_cross
+    Created with Sketch.
+    
+	
+		
+			
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/cross_white.svg b/core/app/themes/suite8/images/cross_white.svg
new file mode 100644
index 000000000..354cf90b1
--- /dev/null
+++ b/core/app/themes/suite8/images/cross_white.svg
@@ -0,0 +1,17 @@
+
+
+
+
+    01_cross_white
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/cursor_grey.svg b/core/app/themes/suite8/images/cursor_grey.svg
new file mode 100644
index 000000000..235d24a13
--- /dev/null
+++ b/core/app/themes/suite8/images/cursor_grey.svg
@@ -0,0 +1,17 @@
+
+
+
+
+    01_cursor_grey
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/donut_chart.png b/core/app/themes/suite8/images/donut_chart.png
new file mode 100644
index 000000000..3081a8861
Binary files /dev/null and b/core/app/themes/suite8/images/donut_chart.png differ
diff --git a/core/app/themes/suite8/images/dots.svg b/core/app/themes/suite8/images/dots.svg
new file mode 100644
index 000000000..d87df99ca
--- /dev/null
+++ b/core/app/themes/suite8/images/dots.svg
@@ -0,0 +1,21 @@
+
+
+
+
+    12_dots
+    Created with Sketch.
+    
+	
+		
+        
+	
+
+
diff --git a/core/app/themes/suite8/images/dots_hover.svg b/core/app/themes/suite8/images/dots_hover.svg
new file mode 100644
index 000000000..4fe96091f
--- /dev/null
+++ b/core/app/themes/suite8/images/dots_hover.svg
@@ -0,0 +1,15 @@
+
+
+    
+    12_dots_hover
+    Created with Sketch.
+    
+    
+        
+            
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/double_arrows.svg b/core/app/themes/suite8/images/double_arrows.svg
new file mode 100644
index 000000000..a9cf6196b
--- /dev/null
+++ b/core/app/themes/suite8/images/double_arrows.svg
@@ -0,0 +1,20 @@
+
+
+
+
+    02_double_arrows
+    Created with Sketch.
+    
+	
+		
+			
+            
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/down_arrow.svg b/core/app/themes/suite8/images/down_arrow.svg
new file mode 100644
index 000000000..0fa207ca0
--- /dev/null
+++ b/core/app/themes/suite8/images/down_arrow.svg
@@ -0,0 +1,16 @@
+
+
+
+
+    01_down_arrow
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/down_arrow_white.svg b/core/app/themes/suite8/images/down_arrow_white.svg
new file mode 100644
index 000000000..efe423c1c
--- /dev/null
+++ b/core/app/themes/suite8/images/down_arrow_white.svg
@@ -0,0 +1,16 @@
+
+
+
+
+    02_down_arrow_white
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/download.svg b/core/app/themes/suite8/images/download.svg
new file mode 100644
index 000000000..0ebf05b12
--- /dev/null
+++ b/core/app/themes/suite8/images/download.svg
@@ -0,0 +1,17 @@
+
+
+
+
+    07_download
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/drop_menu_arrow.svg b/core/app/themes/suite8/images/drop_menu_arrow.svg
new file mode 100644
index 000000000..7d84f843b
--- /dev/null
+++ b/core/app/themes/suite8/images/drop_menu_arrow.svg
@@ -0,0 +1,15 @@
+
+
+    
+    12_drop_menu_arrow
+    Created with Sketch.
+    
+    
+        
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/edit.svg b/core/app/themes/suite8/images/edit.svg
new file mode 100644
index 000000000..2ea0953f7
--- /dev/null
+++ b/core/app/themes/suite8/images/edit.svg
@@ -0,0 +1,19 @@
+
+
+
+
+    06_edit
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/email_purple.svg b/core/app/themes/suite8/images/email_purple.svg
new file mode 100644
index 000000000..fd6974f02
--- /dev/null
+++ b/core/app/themes/suite8/images/email_purple.svg
@@ -0,0 +1,18 @@
+
+
+
+
+    02_email_purple
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/email_purple_hover.svg b/core/app/themes/suite8/images/email_purple_hover.svg
new file mode 100644
index 000000000..b30700950
--- /dev/null
+++ b/core/app/themes/suite8/images/email_purple_hover.svg
@@ -0,0 +1,14 @@
+
+
+    
+    02_email_purple_hover
+    Created with Sketch.
+    
+    
+        
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/expand_arrow.svg b/core/app/themes/suite8/images/expand_arrow.svg
new file mode 100644
index 000000000..7ab373da3
--- /dev/null
+++ b/core/app/themes/suite8/images/expand_arrow.svg
@@ -0,0 +1,17 @@
+
+
+
+
+    12_expand_arrow
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/eye.svg b/core/app/themes/suite8/images/eye.svg
new file mode 100644
index 000000000..c0525073c
--- /dev/null
+++ b/core/app/themes/suite8/images/eye.svg
@@ -0,0 +1,22 @@
+
+
+
+
+    12_eye
+    Created with Sketch.
+    
+	
+		
+			
+            
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/favicon.ico b/core/app/themes/suite8/images/favicon.ico
new file mode 100644
index 000000000..b27032fd4
Binary files /dev/null and b/core/app/themes/suite8/images/favicon.ico differ
diff --git a/core/app/themes/suite8/images/filter_icon.svg b/core/app/themes/suite8/images/filter_icon.svg
new file mode 100644
index 000000000..d3fed767b
--- /dev/null
+++ b/core/app/themes/suite8/images/filter_icon.svg
@@ -0,0 +1,17 @@
+
+
+
+
+    02_filter_icon
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/folder_blue.svg b/core/app/themes/suite8/images/folder_blue.svg
new file mode 100644
index 000000000..0cde7a741
--- /dev/null
+++ b/core/app/themes/suite8/images/folder_blue.svg
@@ -0,0 +1,18 @@
+
+
+
+
+    15_folder_blue
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/folder_white.svg b/core/app/themes/suite8/images/folder_white.svg
new file mode 100644
index 000000000..bb9ce26c1
--- /dev/null
+++ b/core/app/themes/suite8/images/folder_white.svg
@@ -0,0 +1,18 @@
+
+
+
+
+    15_folder_white
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/graph_white.svg b/core/app/themes/suite8/images/graph_white.svg
new file mode 100644
index 000000000..b756f6624
--- /dev/null
+++ b/core/app/themes/suite8/images/graph_white.svg
@@ -0,0 +1,21 @@
+
+
+
+
+    12_graph_white
+    Created with Sketch.
+    
+	
+		
+			
+            
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/hamburger.svg b/core/app/themes/suite8/images/hamburger.svg
new file mode 100644
index 000000000..22e6c5f95
--- /dev/null
+++ b/core/app/themes/suite8/images/hamburger.svg
@@ -0,0 +1,17 @@
+
+
+    
+    hamburger
+    Created with Sketch.
+    
+    
+        
+            
+                
+                
+                
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/history_icon.svg b/core/app/themes/suite8/images/history_icon.svg
new file mode 100644
index 000000000..64e1f63c7
--- /dev/null
+++ b/core/app/themes/suite8/images/history_icon.svg
@@ -0,0 +1,29 @@
+
+
+
+
+    14_history_icon
+    Created with Sketch.
+    
+	
+		
+	
+        
+        
+        
+		
+            
+	
+        
+
+
diff --git a/core/app/themes/suite8/images/home_icon.svg b/core/app/themes/suite8/images/home_icon.svg
new file mode 100644
index 000000000..d046f80aa
--- /dev/null
+++ b/core/app/themes/suite8/images/home_icon.svg
@@ -0,0 +1,17 @@
+
+
+
+
+    02_home_icon
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/home_icon_red.svg b/core/app/themes/suite8/images/home_icon_red.svg
new file mode 100644
index 000000000..d1afbf38e
--- /dev/null
+++ b/core/app/themes/suite8/images/home_icon_red.svg
@@ -0,0 +1,17 @@
+
+
+
+
+    05_home_icon_red
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/icon_first.svg b/core/app/themes/suite8/images/icon_first.svg
new file mode 100644
index 000000000..538923f6b
--- /dev/null
+++ b/core/app/themes/suite8/images/icon_first.svg
@@ -0,0 +1,15 @@
+
+
+    
+    icon_first
+    Created with Sketch.
+    
+    
+        
+            
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/icon_last.svg b/core/app/themes/suite8/images/icon_last.svg
new file mode 100644
index 000000000..f7b38bd66
--- /dev/null
+++ b/core/app/themes/suite8/images/icon_last.svg
@@ -0,0 +1,15 @@
+
+
+    
+    icon_last
+    Created with Sketch.
+    
+    
+        
+            
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/icon_modal_close.svg b/core/app/themes/suite8/images/icon_modal_close.svg
new file mode 100644
index 000000000..099da7f7a
--- /dev/null
+++ b/core/app/themes/suite8/images/icon_modal_close.svg
@@ -0,0 +1,19 @@
+
+
+    
+    icon_modal_close
+    Created with Sketch.
+    
+    
+        
+            
+                +
+            
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/icon_next.svg b/core/app/themes/suite8/images/icon_next.svg
new file mode 100644
index 000000000..65eed16ec
--- /dev/null
+++ b/core/app/themes/suite8/images/icon_next.svg
@@ -0,0 +1,15 @@
+
+
+    
+    icon_next
+    Created with Sketch.
+    
+    
+        
+            
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/icon_prev.svg b/core/app/themes/suite8/images/icon_prev.svg
new file mode 100644
index 000000000..d74cfb78a
--- /dev/null
+++ b/core/app/themes/suite8/images/icon_prev.svg
@@ -0,0 +1,15 @@
+
+
+    
+    icon_prev
+    Created with Sketch.
+    
+    
+        
+            
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/info.svg b/core/app/themes/suite8/images/info.svg
new file mode 100644
index 000000000..243ffeea4
--- /dev/null
+++ b/core/app/themes/suite8/images/info.svg
@@ -0,0 +1,21 @@
+
+
+
+
+    01_info
+    Created with Sketch.
+    
+	
+		
+        
+	
+
+
diff --git a/core/app/themes/suite8/images/info_circled.svg b/core/app/themes/suite8/images/info_circled.svg
new file mode 100644
index 000000000..efc95ab34
--- /dev/null
+++ b/core/app/themes/suite8/images/info_circled.svg
@@ -0,0 +1,24 @@
+
+
+
+
+    18_info
+    Created with Sketch.
+    
+	
+		
+			
+				
+			
+            
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/info_dark.svg b/core/app/themes/suite8/images/info_dark.svg
new file mode 100644
index 000000000..7404071b3
--- /dev/null
+++ b/core/app/themes/suite8/images/info_dark.svg
@@ -0,0 +1,22 @@
+
+
+
+
+    17_info
+    Created with Sketch.
+    
+	
+		
+			
+		
+        
+	
+
+
diff --git a/core/app/themes/suite8/images/info_hover.svg b/core/app/themes/suite8/images/info_hover.svg
new file mode 100644
index 000000000..1f222ff42
--- /dev/null
+++ b/core/app/themes/suite8/images/info_hover.svg
@@ -0,0 +1,17 @@
+
+
+    
+    17_info_hover
+    Created with Sketch.
+    
+    
+        
+            
+                
+            
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/info_hover_dark.svg b/core/app/themes/suite8/images/info_hover_dark.svg
new file mode 100644
index 000000000..0b2434956
--- /dev/null
+++ b/core/app/themes/suite8/images/info_hover_dark.svg
@@ -0,0 +1,19 @@
+
+
+    
+    18_info_hover
+    Created with Sketch.
+    
+    
+        
+            
+                
+                    
+                
+                
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/kanban.svg b/core/app/themes/suite8/images/kanban.svg
new file mode 100644
index 000000000..13524b22b
--- /dev/null
+++ b/core/app/themes/suite8/images/kanban.svg
@@ -0,0 +1,23 @@
+
+
+
+
+    17_kanban
+    Created with Sketch.
+    
+	
+		
+			
+            
+            
+            
+            
+            
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/letter.svg b/core/app/themes/suite8/images/letter.svg
new file mode 100644
index 000000000..7a8c90753
--- /dev/null
+++ b/core/app/themes/suite8/images/letter.svg
@@ -0,0 +1,14 @@
+
+
+    
+    17_letter
+    Created with Sketch.
+    
+    
+        
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/letter_hover.svg b/core/app/themes/suite8/images/letter_hover.svg
new file mode 100644
index 000000000..1cf76b008
--- /dev/null
+++ b/core/app/themes/suite8/images/letter_hover.svg
@@ -0,0 +1,14 @@
+
+
+    
+    17_letter_hover
+    Created with Sketch.
+    
+    
+        
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/list_icon_purple.svg b/core/app/themes/suite8/images/list_icon_purple.svg
new file mode 100644
index 000000000..9c75166c1
--- /dev/null
+++ b/core/app/themes/suite8/images/list_icon_purple.svg
@@ -0,0 +1,21 @@
+
+
+
+
+    02_list_icon_purple
+    Created with Sketch.
+    
+	
+		
+			
+            
+            
+            
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/list_icon_purple_hover.svg b/core/app/themes/suite8/images/list_icon_purple_hover.svg
new file mode 100644
index 000000000..f82b6be98
--- /dev/null
+++ b/core/app/themes/suite8/images/list_icon_purple_hover.svg
@@ -0,0 +1,18 @@
+
+
+    
+    02_list_icon_purple_hover
+    Created with Sketch.
+    
+    
+        
+            
+                
+                
+                
+                
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/login_password.svg b/core/app/themes/suite8/images/login_password.svg
new file mode 100644
index 000000000..404e58b9f
--- /dev/null
+++ b/core/app/themes/suite8/images/login_password.svg
@@ -0,0 +1,16 @@
+
+
+    
+    login_password
+    Created with Sketch.
+    
+    
+        
+            
+                ***
+            
+        
+    
+
diff --git a/core/app/themes/suite8/images/login_user.svg b/core/app/themes/suite8/images/login_user.svg
new file mode 100644
index 000000000..ea63605f2
--- /dev/null
+++ b/core/app/themes/suite8/images/login_user.svg
@@ -0,0 +1,27 @@
+
+
+    
+    login_user
+    Created with Sketch.
+    
+        
+    
+    
+        
+            
+            
+                
+                    
+                
+                
+                
+            
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/mega_blue.svg b/core/app/themes/suite8/images/mega_blue.svg
new file mode 100644
index 000000000..80c442491
--- /dev/null
+++ b/core/app/themes/suite8/images/mega_blue.svg
@@ -0,0 +1,19 @@
+
+
+
+
+    15_mega_blue
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/mega_white.svg b/core/app/themes/suite8/images/mega_white.svg
new file mode 100644
index 000000000..e1840b303
--- /dev/null
+++ b/core/app/themes/suite8/images/mega_white.svg
@@ -0,0 +1,19 @@
+
+
+
+
+    15_mega_white
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/minimise.svg b/core/app/themes/suite8/images/minimise.svg
new file mode 100644
index 000000000..874abc139
--- /dev/null
+++ b/core/app/themes/suite8/images/minimise.svg
@@ -0,0 +1,16 @@
+
+
+
+
+    13_minimise
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/minimise_circled.svg b/core/app/themes/suite8/images/minimise_circled.svg
new file mode 100644
index 000000000..34094c248
--- /dev/null
+++ b/core/app/themes/suite8/images/minimise_circled.svg
@@ -0,0 +1,22 @@
+
+
+
+
+    03_minimise
+    Created with Sketch.
+    
+	
+		
+			
+            
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/mobile_collapse_icon.svg b/core/app/themes/suite8/images/mobile_collapse_icon.svg
new file mode 100644
index 000000000..4b4dd3043
--- /dev/null
+++ b/core/app/themes/suite8/images/mobile_collapse_icon.svg
@@ -0,0 +1,15 @@
+
+
+    
+    02_mobile_collapse_icon
+    Created with Sketch.
+    
+    
+        
+            
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/mobile_expand_calendar copy.svg b/core/app/themes/suite8/images/mobile_expand_calendar copy.svg
new file mode 100644
index 000000000..7062db0c0
--- /dev/null
+++ b/core/app/themes/suite8/images/mobile_expand_calendar copy.svg	
@@ -0,0 +1,20 @@
+
+
+    
+    02_mobile_expand_calendar copy
+    Created with Sketch.
+    
+    
+        
+            
+                
+                
+                
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/mobile_expand_calendar.svg b/core/app/themes/suite8/images/mobile_expand_calendar.svg
new file mode 100644
index 000000000..4895b9a0a
--- /dev/null
+++ b/core/app/themes/suite8/images/mobile_expand_calendar.svg
@@ -0,0 +1,20 @@
+
+
+    
+    02_mobile_expand_calendar
+    Created with Sketch.
+    
+    
+        
+            
+                
+                
+                
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/mobile_expand_check_icon.svg b/core/app/themes/suite8/images/mobile_expand_check_icon.svg
new file mode 100644
index 000000000..0fbd3789b
--- /dev/null
+++ b/core/app/themes/suite8/images/mobile_expand_check_icon.svg
@@ -0,0 +1,18 @@
+
+
+    
+    02_mobile_expand_check_icon
+    Created with Sketch.
+    
+        
+    
+    
+        
+            
+                
+                
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/mobile_expand_icon.svg b/core/app/themes/suite8/images/mobile_expand_icon.svg
new file mode 100644
index 000000000..28133951f
--- /dev/null
+++ b/core/app/themes/suite8/images/mobile_expand_icon.svg
@@ -0,0 +1,15 @@
+
+
+    
+    02_mobile_expand_icon
+    Created with Sketch.
+    
+    
+        
+            
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/mobile_expand_letter copy.svg b/core/app/themes/suite8/images/mobile_expand_letter copy.svg
new file mode 100644
index 000000000..0f5a1117c
--- /dev/null
+++ b/core/app/themes/suite8/images/mobile_expand_letter copy.svg	
@@ -0,0 +1,14 @@
+
+
+    
+    02_mobile_expand_letter copy
+    Created with Sketch.
+    
+    
+        
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/mobile_expand_letter.svg b/core/app/themes/suite8/images/mobile_expand_letter.svg
new file mode 100644
index 000000000..5da7471ee
--- /dev/null
+++ b/core/app/themes/suite8/images/mobile_expand_letter.svg
@@ -0,0 +1,14 @@
+
+
+    
+    02_mobile_expand_letter
+    Created with Sketch.
+    
+    
+        
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/mobile_expand_list copy.svg b/core/app/themes/suite8/images/mobile_expand_list copy.svg
new file mode 100644
index 000000000..3c681cd28
--- /dev/null
+++ b/core/app/themes/suite8/images/mobile_expand_list copy.svg	
@@ -0,0 +1,18 @@
+
+
+    
+    02_mobile_expand_list copy
+    Created with Sketch.
+    
+    
+        
+            
+                
+                
+                
+                
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/mobile_expand_list.svg b/core/app/themes/suite8/images/mobile_expand_list.svg
new file mode 100644
index 000000000..8b3b16115
--- /dev/null
+++ b/core/app/themes/suite8/images/mobile_expand_list.svg
@@ -0,0 +1,18 @@
+
+
+    
+    02_mobile_expand_list
+    Created with Sketch.
+    
+    
+        
+            
+                
+                
+                
+                
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/mobile_expand_phone copy.svg b/core/app/themes/suite8/images/mobile_expand_phone copy.svg
new file mode 100644
index 000000000..902ef4198
--- /dev/null
+++ b/core/app/themes/suite8/images/mobile_expand_phone copy.svg	
@@ -0,0 +1,14 @@
+
+
+    
+    02_mobile_expand_phone copy
+    Created with Sketch.
+    
+    
+        
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/mobile_expand_phone.svg b/core/app/themes/suite8/images/mobile_expand_phone.svg
new file mode 100644
index 000000000..7bb33f13e
--- /dev/null
+++ b/core/app/themes/suite8/images/mobile_expand_phone.svg
@@ -0,0 +1,14 @@
+
+
+    
+    02_mobile_expand_phone
+    Created with Sketch.
+    
+    
+        
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/padlock_blue.svg b/core/app/themes/suite8/images/padlock_blue.svg
new file mode 100644
index 000000000..f984dc3a2
--- /dev/null
+++ b/core/app/themes/suite8/images/padlock_blue.svg
@@ -0,0 +1,37 @@
+
+
+
+
+    15_padlock_blue
+    Created with Sketch.
+    
+	
+		
+			
+			
+            
+				
+					
+				
+			
+            
+				
+					
+				
+			
+            
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/padlock_white.svg b/core/app/themes/suite8/images/padlock_white.svg
new file mode 100644
index 000000000..dee5a0de8
--- /dev/null
+++ b/core/app/themes/suite8/images/padlock_white.svg
@@ -0,0 +1,37 @@
+
+
+
+
+    15_padlock_white
+    Created with Sketch.
+    
+	
+		
+			
+			
+            
+				
+					
+				
+			
+            
+				
+					
+				
+			
+            
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/pencil_grey.svg b/core/app/themes/suite8/images/pencil_grey.svg
new file mode 100644
index 000000000..789f668cf
--- /dev/null
+++ b/core/app/themes/suite8/images/pencil_grey.svg
@@ -0,0 +1,24 @@
+
+
+
+
+    12_pencil_grey
+    Created with Sketch.
+    
+	
+		
+			
+			
+                
+                
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/pencil_grey_hover.svg b/core/app/themes/suite8/images/pencil_grey_hover.svg
new file mode 100644
index 000000000..43d2579ea
--- /dev/null
+++ b/core/app/themes/suite8/images/pencil_grey_hover.svg
@@ -0,0 +1,21 @@
+
+
+    
+    12_pencil_grey_hover
+    Created with Sketch.
+    
+    
+        
+            
+                
+                
+                
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/person_blue.svg b/core/app/themes/suite8/images/person_blue.svg
new file mode 100644
index 000000000..27b4c2091
--- /dev/null
+++ b/core/app/themes/suite8/images/person_blue.svg
@@ -0,0 +1,16 @@
+
+
+
+
+    15_person_blue
+    Created with Sketch.
+    
+    
+    
+
diff --git a/core/app/themes/suite8/images/person_white.svg b/core/app/themes/suite8/images/person_white.svg
new file mode 100644
index 000000000..6e0f28183
--- /dev/null
+++ b/core/app/themes/suite8/images/person_white.svg
@@ -0,0 +1,16 @@
+
+
+
+
+    15_person_white
+    Created with Sketch.
+    
+    
+    
+
diff --git a/core/app/themes/suite8/images/phone.svg b/core/app/themes/suite8/images/phone.svg
new file mode 100644
index 000000000..7a35f1554
--- /dev/null
+++ b/core/app/themes/suite8/images/phone.svg
@@ -0,0 +1,18 @@
+
+
+
+
+    06_phone
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/phone_dark.svg b/core/app/themes/suite8/images/phone_dark.svg
new file mode 100644
index 000000000..351022047
--- /dev/null
+++ b/core/app/themes/suite8/images/phone_dark.svg
@@ -0,0 +1,18 @@
+
+
+
+
+    17_phone
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/phone_hover.svg b/core/app/themes/suite8/images/phone_hover.svg
new file mode 100644
index 000000000..d2d7006ba
--- /dev/null
+++ b/core/app/themes/suite8/images/phone_hover.svg
@@ -0,0 +1,14 @@
+
+
+    
+    17_phone_hover
+    Created with Sketch.
+    
+    
+        
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/phone_purple.svg b/core/app/themes/suite8/images/phone_purple.svg
new file mode 100644
index 000000000..4e5102c71
--- /dev/null
+++ b/core/app/themes/suite8/images/phone_purple.svg
@@ -0,0 +1,18 @@
+
+
+
+
+    02_phone_purple
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/phone_purple_hover.svg b/core/app/themes/suite8/images/phone_purple_hover.svg
new file mode 100644
index 000000000..c8fe56e1e
--- /dev/null
+++ b/core/app/themes/suite8/images/phone_purple_hover.svg
@@ -0,0 +1,14 @@
+
+
+    
+    02_phone_purple_hover
+    Created with Sketch.
+    
+    
+        
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/pie_blue.svg b/core/app/themes/suite8/images/pie_blue.svg
new file mode 100644
index 000000000..f2428d4af
--- /dev/null
+++ b/core/app/themes/suite8/images/pie_blue.svg
@@ -0,0 +1,22 @@
+
+
+
+
+    15_pie_blue
+    Created with Sketch.
+    
+	
+		
+			
+            
+				
+			
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/pie_icon.svg b/core/app/themes/suite8/images/pie_icon.svg
new file mode 100644
index 000000000..597603750
--- /dev/null
+++ b/core/app/themes/suite8/images/pie_icon.svg
@@ -0,0 +1,17 @@
+
+
+
+
+    02_pie_icon
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/pie_white.svg b/core/app/themes/suite8/images/pie_white.svg
new file mode 100644
index 000000000..14ad2697a
--- /dev/null
+++ b/core/app/themes/suite8/images/pie_white.svg
@@ -0,0 +1,22 @@
+
+
+
+
+    15_pie_white
+    Created with Sketch.
+    
+	
+		
+			
+            
+				
+			
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/pipeline_chart.png b/core/app/themes/suite8/images/pipeline_chart.png
new file mode 100644
index 000000000..6cc888b6b
Binary files /dev/null and b/core/app/themes/suite8/images/pipeline_chart.png differ
diff --git a/core/app/themes/suite8/images/plus.svg b/core/app/themes/suite8/images/plus.svg
new file mode 100644
index 000000000..23bc67eeb
--- /dev/null
+++ b/core/app/themes/suite8/images/plus.svg
@@ -0,0 +1,17 @@
+
+
+
+
+    04_plus
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/plus_dark.svg b/core/app/themes/suite8/images/plus_dark.svg
new file mode 100644
index 000000000..da0b40381
--- /dev/null
+++ b/core/app/themes/suite8/images/plus_dark.svg
@@ -0,0 +1,17 @@
+
+
+
+
+    15_plus
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/plus_grey.svg b/core/app/themes/suite8/images/plus_grey.svg
new file mode 100644
index 000000000..a8a491afa
--- /dev/null
+++ b/core/app/themes/suite8/images/plus_grey.svg
@@ -0,0 +1,18 @@
+
+
+
+
+    17_plus
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/plus_hover.svg b/core/app/themes/suite8/images/plus_hover.svg
new file mode 100644
index 000000000..0354eb685
--- /dev/null
+++ b/core/app/themes/suite8/images/plus_hover.svg
@@ -0,0 +1,14 @@
+
+
+    
+    05_plus_hover
+    Created with Sketch.
+    
+    
+        
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/plus_thin.svg b/core/app/themes/suite8/images/plus_thin.svg
new file mode 100644
index 000000000..ede7a852f
--- /dev/null
+++ b/core/app/themes/suite8/images/plus_thin.svg
@@ -0,0 +1,17 @@
+
+
+
+
+    05_plus
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/plus_white.svg b/core/app/themes/suite8/images/plus_white.svg
new file mode 100644
index 000000000..aaaf1efac
--- /dev/null
+++ b/core/app/themes/suite8/images/plus_white.svg
@@ -0,0 +1,17 @@
+
+
+
+
+    07_plus
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/pound_blue.svg b/core/app/themes/suite8/images/pound_blue.svg
new file mode 100644
index 000000000..7440ae604
--- /dev/null
+++ b/core/app/themes/suite8/images/pound_blue.svg
@@ -0,0 +1,22 @@
+
+
+
+
+    15_pound_blue
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/pound_white.svg b/core/app/themes/suite8/images/pound_white.svg
new file mode 100644
index 000000000..18a29d009
--- /dev/null
+++ b/core/app/themes/suite8/images/pound_white.svg
@@ -0,0 +1,22 @@
+
+
+
+
+    15_pound_white
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/poundbox_blue.svg b/core/app/themes/suite8/images/poundbox_blue.svg
new file mode 100644
index 000000000..e687c41de
--- /dev/null
+++ b/core/app/themes/suite8/images/poundbox_blue.svg
@@ -0,0 +1,26 @@
+
+
+
+
+    15_poundbox_blue
+    Created with Sketch.
+    
+	
+		
+			
+            
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/poundbox_white.svg b/core/app/themes/suite8/images/poundbox_white.svg
new file mode 100644
index 000000000..14bf718cd
--- /dev/null
+++ b/core/app/themes/suite8/images/poundbox_white.svg
@@ -0,0 +1,26 @@
+
+
+
+
+    15_poundbox_white
+    Created with Sketch.
+    
+	
+		
+			
+            
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/purplecross.svg b/core/app/themes/suite8/images/purplecross.svg
new file mode 100644
index 000000000..7274a5684
--- /dev/null
+++ b/core/app/themes/suite8/images/purplecross.svg
@@ -0,0 +1,16 @@
+
+
+    
+    05_purplecross
+    Created with Sketch.
+    
+    
+        
+            
+                +
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/purplecross_hover.svg b/core/app/themes/suite8/images/purplecross_hover.svg
new file mode 100644
index 000000000..b4d01cf3e
--- /dev/null
+++ b/core/app/themes/suite8/images/purplecross_hover.svg
@@ -0,0 +1,16 @@
+
+
+    
+    05_purplecross_hover
+    Created with Sketch.
+    
+    
+        
+            
+                +
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/purplepen.svg b/core/app/themes/suite8/images/purplepen.svg
new file mode 100644
index 000000000..9d461e4bf
--- /dev/null
+++ b/core/app/themes/suite8/images/purplepen.svg
@@ -0,0 +1,36 @@
+
+
+    
+    05_purplepen
+    Created with Sketch.
+    
+        
+        
+    
+    
+        
+            
+                
+                    
+                        
+                    
+                    
+                    
+                
+                
+                
+                    
+                        
+                    
+                    
+                    
+                
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/purplepen_hover.svg b/core/app/themes/suite8/images/purplepen_hover.svg
new file mode 100644
index 000000000..0cbaac32f
--- /dev/null
+++ b/core/app/themes/suite8/images/purplepen_hover.svg
@@ -0,0 +1,36 @@
+
+
+    
+    05_purplepen_hover
+    Created with Sketch.
+    
+        
+        
+    
+    
+        
+            
+                
+                    
+                        
+                    
+                    
+                    
+                
+                
+                
+                    
+                        
+                    
+                    
+                    
+                
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/refresh.svg b/core/app/themes/suite8/images/refresh.svg
new file mode 100644
index 000000000..94b33f783
--- /dev/null
+++ b/core/app/themes/suite8/images/refresh.svg
@@ -0,0 +1,25 @@
+
+
+
+
+    05_refresh
+    Created with Sketch.
+    
+	
+		
+			
+            
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/refresh_hover.svg b/core/app/themes/suite8/images/refresh_hover.svg
new file mode 100644
index 000000000..010ac5607
--- /dev/null
+++ b/core/app/themes/suite8/images/refresh_hover.svg
@@ -0,0 +1,18 @@
+
+
+    
+    05_refresh_hover
+    Created with Sketch.
+    
+    
+        
+            
+                
+                
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/search.svg b/core/app/themes/suite8/images/search.svg
new file mode 100644
index 000000000..a1dc42d24
--- /dev/null
+++ b/core/app/themes/suite8/images/search.svg
@@ -0,0 +1,22 @@
+
+
+
+
+    02_search
+    Created with Sketch.
+    
+	
+		
+			
+            
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/settings.svg b/core/app/themes/suite8/images/settings.svg
new file mode 100644
index 000000000..eb6c13541
--- /dev/null
+++ b/core/app/themes/suite8/images/settings.svg
@@ -0,0 +1,20 @@
+
+
+
+
+    05_settings
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/settings_hover.svg b/core/app/themes/suite8/images/settings_hover.svg
new file mode 100644
index 000000000..965749d14
--- /dev/null
+++ b/core/app/themes/suite8/images/settings_hover.svg
@@ -0,0 +1,14 @@
+
+
+    
+    05_settings_hover
+    Created with Sketch.
+    
+    
+        
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/shield_blue.svg b/core/app/themes/suite8/images/shield_blue.svg
new file mode 100644
index 000000000..a99e80199
--- /dev/null
+++ b/core/app/themes/suite8/images/shield_blue.svg
@@ -0,0 +1,35 @@
+
+
+
+
+    15_shield_blue
+    Created with Sketch.
+    
+	
+		
+			
+			
+            
+				
+					
+				
+			
+            
+				
+					
+				
+			
+            
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/shield_white.svg b/core/app/themes/suite8/images/shield_white.svg
new file mode 100644
index 000000000..854211f40
--- /dev/null
+++ b/core/app/themes/suite8/images/shield_white.svg
@@ -0,0 +1,35 @@
+
+
+
+
+    15_shield_white
+    Created with Sketch.
+    
+	
+		
+			
+			
+            
+				
+					
+				
+			
+            
+				
+					
+				
+			
+            
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/signature_blue.svg b/core/app/themes/suite8/images/signature_blue.svg
new file mode 100644
index 000000000..42d3ebbf4
--- /dev/null
+++ b/core/app/themes/suite8/images/signature_blue.svg
@@ -0,0 +1,29 @@
+
+
+
+
+    15_signature_blue
+    Created with Sketch.
+    
+	
+		
+			
+            
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/signature_white.svg b/core/app/themes/suite8/images/signature_white.svg
new file mode 100644
index 000000000..b19343d2e
--- /dev/null
+++ b/core/app/themes/suite8/images/signature_white.svg
@@ -0,0 +1,29 @@
+
+
+
+
+    15_signature_white
+    Created with Sketch.
+    
+	
+		
+			
+            
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/sort.svg b/core/app/themes/suite8/images/sort.svg
new file mode 100644
index 000000000..01e033f90
--- /dev/null
+++ b/core/app/themes/suite8/images/sort.svg
@@ -0,0 +1,16 @@
+
+
+    
+    sort
+    Created with Sketch.
+    
+    
+        
+            
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/sort_ascend.svg b/core/app/themes/suite8/images/sort_ascend.svg
new file mode 100644
index 000000000..d72def80c
--- /dev/null
+++ b/core/app/themes/suite8/images/sort_ascend.svg
@@ -0,0 +1,16 @@
+
+
+    
+    sort_ascend
+    Created with Sketch.
+    
+    
+        
+            
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/sort_descend.svg b/core/app/themes/suite8/images/sort_descend.svg
new file mode 100644
index 000000000..09f04263f
--- /dev/null
+++ b/core/app/themes/suite8/images/sort_descend.svg
@@ -0,0 +1,16 @@
+
+
+    
+    sort_descend
+    Created with Sketch.
+    
+    
+        
+            
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/spark_blue.svg b/core/app/themes/suite8/images/spark_blue.svg
new file mode 100644
index 000000000..af8543d35
--- /dev/null
+++ b/core/app/themes/suite8/images/spark_blue.svg
@@ -0,0 +1,18 @@
+
+
+
+
+    15_spark_blue
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/spark_white.svg b/core/app/themes/suite8/images/spark_white.svg
new file mode 100644
index 000000000..684314d17
--- /dev/null
+++ b/core/app/themes/suite8/images/spark_white.svg
@@ -0,0 +1,18 @@
+
+
+
+
+    15_spark_white
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/star.svg b/core/app/themes/suite8/images/star.svg
new file mode 100644
index 000000000..18f8b070c
--- /dev/null
+++ b/core/app/themes/suite8/images/star.svg
@@ -0,0 +1,18 @@
+
+
+
+
+    09_star
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/star_icon.svg b/core/app/themes/suite8/images/star_icon.svg
new file mode 100644
index 000000000..c0fc7123a
--- /dev/null
+++ b/core/app/themes/suite8/images/star_icon.svg
@@ -0,0 +1,18 @@
+
+
+
+
+    02_star_icon
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/suitecrm_logo.png b/core/app/themes/suite8/images/suitecrm_logo.png
new file mode 100644
index 000000000..f16e2fdb2
Binary files /dev/null and b/core/app/themes/suite8/images/suitecrm_logo.png differ
diff --git a/core/app/themes/suite8/images/tick.svg b/core/app/themes/suite8/images/tick.svg
new file mode 100644
index 000000000..508a1a676
--- /dev/null
+++ b/core/app/themes/suite8/images/tick.svg
@@ -0,0 +1,17 @@
+
+
+
+
+    12_tick
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/user.svg b/core/app/themes/suite8/images/user.svg
new file mode 100644
index 000000000..00ae7f5a6
--- /dev/null
+++ b/core/app/themes/suite8/images/user.svg
@@ -0,0 +1,22 @@
+
+
+
+
+    02_user
+    Created with Sketch.
+    
+	
+		
+			
+            
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/vert_line.svg b/core/app/themes/suite8/images/vert_line.svg
new file mode 100644
index 000000000..a1e5b489e
--- /dev/null
+++ b/core/app/themes/suite8/images/vert_line.svg
@@ -0,0 +1,16 @@
+
+
+
+
+    14_vert_line
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/view.svg b/core/app/themes/suite8/images/view.svg
new file mode 100644
index 000000000..adf6f93de
--- /dev/null
+++ b/core/app/themes/suite8/images/view.svg
@@ -0,0 +1,22 @@
+
+
+
+
+    07_view
+    Created with Sketch.
+    
+	
+		
+			
+            
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/white_pencil.svg b/core/app/themes/suite8/images/white_pencil.svg
new file mode 100644
index 000000000..5d04b20cb
--- /dev/null
+++ b/core/app/themes/suite8/images/white_pencil.svg
@@ -0,0 +1,59 @@
+
+
+
+
+    03_white_pencil
+    Created with Sketch.
+    
+	
+		
+			
+				
+				
+                
+					
+						
+					
+				
+                
+					
+						
+					
+				
+                
+			
+            
+            
+				
+				
+                
+					
+						
+					
+				
+                
+					
+						
+					
+				
+                
+			
+		
+	
+
+
diff --git a/core/app/themes/suite8/suite8.php b/core/app/themes/suite8/suite8.php
new file mode 100644
index 000000000..9337764ce
--- /dev/null
+++ b/core/app/themes/suite8/suite8.php
@@ -0,0 +1,3 @@
+
\ No newline at end of file
diff --git a/core/app/ui/components/account/account.component.spec.ts b/core/app/ui/components/account/account.component.spec.ts
new file mode 100644
index 000000000..769bbdf1e
--- /dev/null
+++ b/core/app/ui/components/account/account.component.spec.ts
@@ -0,0 +1,57 @@
+import {async, ComponentFixture, TestBed} from '@angular/core/testing';
+
+import {CommonModule} from '@angular/common';
+
+import {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core';
+
+import {RouterTestingModule} from '@angular/router/testing';
+
+import {PluginManagerModule} from '../../../plugin-manager/plugin-manager.module';
+
+import {SharedModule} from '../../shared/shared.module';
+
+import {AccountComponent} from './account.component';
+import {AppModule} from '../../../app.module';
+import {Router} from '@angular/router';
+import {HttpClientModule} from '@angular/common/http';
+
+let mockRouter: any;
+
+class MockRouter {
+    navigate = jasmine.createSpy('navigate');
+}
+
+export const testImports = [
+    CommonModule,
+    RouterTestingModule,
+    HttpClientModule,
+    SharedModule,
+    PluginManagerModule.forChild(AccountComponent),
+];
+
+describe('AccountComponent', () => {
+    let component: AccountComponent;
+    let fixture: ComponentFixture;
+
+    beforeEach(async(() => {
+        TestBed.configureTestingModule({
+            declarations: [
+                AccountComponent,
+            ],
+            imports: testImports,
+            providers: [{provide: Router, useValue: mockRouter}],
+            schemas: [CUSTOM_ELEMENTS_SCHEMA]
+        })
+            .compileComponents();
+    }));
+
+    beforeEach(() => {
+        fixture = TestBed.createComponent(AccountComponent);
+        component = fixture.componentInstance;
+        fixture.detectChanges();
+    });
+
+    it('should create', () => {
+        expect(component).toBeTruthy();
+    });
+});
\ No newline at end of file
diff --git a/core/app/ui/components/account/account.component.ts b/core/app/ui/components/account/account.component.ts
new file mode 100644
index 000000000..1e31eeb2c
--- /dev/null
+++ b/core/app/ui/components/account/account.component.ts
@@ -0,0 +1,16 @@
+import {Component, OnInit} from '@angular/core';
+
+@Component({
+    selector: 'scrm-account-ui',
+    templateUrl: './account.component.html',
+    styleUrls: []
+})
+export class AccountUiComponent implements OnInit {
+
+    constructor() {
+    }
+
+    ngOnInit() {
+    }
+
+}
diff --git a/core/app/ui/components/account/account.module.ts b/core/app/ui/components/account/account.module.ts
new file mode 100644
index 000000000..9ff4a290c
--- /dev/null
+++ b/core/app/ui/components/account/account.module.ts
@@ -0,0 +1,18 @@
+import {NgModule, CUSTOM_ELEMENTS_SCHEMA} from '@angular/core';
+import {CommonModule} from '@angular/common';
+
+import {AppManagerModule} from '../../../../app-manager/app-manager.module';
+import {AccountUiComponent} from './account.component';
+import {ListViewUiModule} from '../list-view/list-view.module';
+
+@NgModule({
+    declarations: [AccountUiComponent],
+    exports: [AccountUiComponent],
+    imports: [
+        CommonModule,
+        AppManagerModule.forChild(AccountUiComponent),
+        ListViewUiModule
+    ]
+})
+export class AccountUiModule {
+}
\ No newline at end of file
diff --git a/core/app/ui/components/action-bar/action-bar-model.ts b/core/app/ui/components/action-bar/action-bar-model.ts
new file mode 100644
index 000000000..967e94e5c
--- /dev/null
+++ b/core/app/ui/components/action-bar/action-bar-model.ts
@@ -0,0 +1,7 @@
+import {LinkModel} from '../navbar/link-model';
+import {FavoriteRecordModel} from './favorite-record-model';
+
+export interface ActionBarModel {
+    createLinks: Array;
+    favoriteRecords: Array;
+}
diff --git a/core/app/ui/components/action-bar/action-bar.component.html b/core/app/ui/components/action-bar/action-bar.component.html
new file mode 100644
index 000000000..b35fb1a38
--- /dev/null
+++ b/core/app/ui/components/action-bar/action-bar.component.html
@@ -0,0 +1,105 @@
+
+
+
+
+ +
+
+
+ + + +
+
+
+ + \ No newline at end of file diff --git a/core/app/ui/components/action-bar/action-bar.component.spec.ts b/core/app/ui/components/action-bar/action-bar.component.spec.ts new file mode 100644 index 000000000..63b541ef2 --- /dev/null +++ b/core/app/ui/components/action-bar/action-bar.component.spec.ts @@ -0,0 +1,31 @@ +import {async, ComponentFixture, TestBed, inject} from '@angular/core/testing'; +import {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'; +import {RouterTestingModule} from '@angular/router/testing'; +import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing'; + +import {ActionBarComponent} from './action-bar.component'; + +describe('ActionBarComponent', () => { + let component: ActionBarComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + schemas: [CUSTOM_ELEMENTS_SCHEMA], + imports: [RouterTestingModule, HttpClientTestingModule], + declarations: [ActionBarComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ActionBarComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it(`should create`, async(inject([HttpTestingController], + (httpClient: HttpTestingController) => { + expect(component).toBeTruthy(); + }))); +}); diff --git a/core/app/ui/components/action-bar/action-bar.component.ts b/core/app/ui/components/action-bar/action-bar.component.ts new file mode 100644 index 000000000..5968bd304 --- /dev/null +++ b/core/app/ui/components/action-bar/action-bar.component.ts @@ -0,0 +1,23 @@ +import {Component, OnInit} from '@angular/core'; +import {ActionBarModel} from './action-bar-model'; + +@Component({ + selector: 'scrm-action-bar-ui', + templateUrl: './action-bar.component.html', + styleUrls: [] +}) +export class ActionBarUiComponent implements OnInit { + + actionBar: ActionBarModel = { + createLinks: [], + favoriteRecords: [], + }; + + constructor() { + } + + ngOnInit(): void { + + } + +} diff --git a/core/app/ui/components/action-bar/action-bar.module.ts b/core/app/ui/components/action-bar/action-bar.module.ts new file mode 100644 index 000000000..a5c5c283b --- /dev/null +++ b/core/app/ui/components/action-bar/action-bar.module.ts @@ -0,0 +1,19 @@ +import {NgModule, CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'; +import {CommonModule} from '@angular/common'; + +import {AppManagerModule} from '../../../../app-manager/app-manager.module'; +import {ActionBarUiComponent} from './action-bar.component'; +import {SvgIconUiModule} from '../svg-icon/svg-icon.module'; + + +@NgModule({ + declarations: [ActionBarUiComponent], + exports: [ActionBarUiComponent], + imports: [ + CommonModule, + AppManagerModule.forChild(ActionBarUiComponent), + SvgIconUiModule + ] +}) +export class ActionBarUiModule { +} \ No newline at end of file diff --git a/core/app/ui/components/action-bar/favorite-record-model.ts b/core/app/ui/components/action-bar/favorite-record-model.ts new file mode 100644 index 000000000..63d329f24 --- /dev/null +++ b/core/app/ui/components/action-bar/favorite-record-model.ts @@ -0,0 +1,7 @@ +export interface FavoriteRecordModel { + id: string; + icon: string; + itemSummary: string; + itemSummaryShort: string; + moduleName: string; +} diff --git a/core/app/ui/components/chart/chart.component.html b/core/app/ui/components/chart/chart.component.html new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/core/app/ui/components/chart/chart.component.html @@ -0,0 +1 @@ + diff --git a/core/app/ui/components/chart/chart.component.spec.ts b/core/app/ui/components/chart/chart.component.spec.ts new file mode 100644 index 000000000..86afda381 --- /dev/null +++ b/core/app/ui/components/chart/chart.component.spec.ts @@ -0,0 +1,33 @@ +import {async, ComponentFixture, TestBed, inject} from '@angular/core/testing'; + +import {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'; +import {RouterTestingModule} from '@angular/router/testing'; + +import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing'; + +import {ChartComponent} from './chart.component'; + +describe('ChartComponent', () => { + let component: ChartComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + schemas: [CUSTOM_ELEMENTS_SCHEMA], + imports: [RouterTestingModule, HttpClientTestingModule], + declarations: [ChartComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ChartComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it(`should create`, async(inject([HttpTestingController], + (httpClient: HttpTestingController) => { + expect(component).toBeTruthy(); + }))); +}); diff --git a/core/app/ui/components/chart/chart.component.ts b/core/app/ui/components/chart/chart.component.ts new file mode 100644 index 000000000..f79b3dc26 --- /dev/null +++ b/core/app/ui/components/chart/chart.component.ts @@ -0,0 +1,12 @@ +import {Component, OnInit, ViewChild} from '@angular/core'; + +@Component({ + selector: 'scrm-chart', + templateUrl: './chart.component.html', + styleUrls: [] +}) +export class ChartUiComponent implements OnInit { + + ngOnInit(): void { + } +} diff --git a/core/app/ui/components/classic-view/classic-view.component.html b/core/app/ui/components/classic-view/classic-view.component.html new file mode 100644 index 000000000..a1183290c --- /dev/null +++ b/core/app/ui/components/classic-view/classic-view.component.html @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/core/app/ui/components/classic-view/classic-view.component.spec.ts b/core/app/ui/components/classic-view/classic-view.component.spec.ts new file mode 100644 index 000000000..48be71d74 --- /dev/null +++ b/core/app/ui/components/classic-view/classic-view.component.spec.ts @@ -0,0 +1,33 @@ +import {async, ComponentFixture, TestBed, inject} from '@angular/core/testing'; +import {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'; +import {FormsModule} from '@angular/forms'; +import {RouterTestingModule} from '@angular/router/testing'; +import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing'; + +import {ClassicViewUiComponent} from './classic-view.component'; +import {ApiService} from '../../services/api/api.service'; + +describe('ClassicViewUiComponent', () => { + let component: ClassicViewUiComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + schemas: [CUSTOM_ELEMENTS_SCHEMA], + imports: [RouterTestingModule, HttpClientTestingModule, FormsModule], + declarations: [ClassicViewUiComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ClassicViewUiComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it(`should create`, async(inject([HttpTestingController], + (router: RouterTestingModule, http: HttpTestingController, api: ApiService) => { + expect(component).toBeTruthy(); + }))); +}); diff --git a/core/app/ui/components/classic-view/classic-view.component.ts b/core/app/ui/components/classic-view/classic-view.component.ts new file mode 100644 index 000000000..612b420b0 --- /dev/null +++ b/core/app/ui/components/classic-view/classic-view.component.ts @@ -0,0 +1,16 @@ +import {Component} from '@angular/core'; +import {Router} from '@angular/router'; + +import {AuthService} from '../../services/auth/auth.service'; +import {LoginResponseModel} from '../../services/auth/login-response-model'; +import {MessageService} from '../../services/message/message.service'; +import {ApiService} from '../../services/api/api.service'; + +@Component({ + selector: 'scrm-classic-view-ui', + templateUrl: './classic-view.component.html', + styleUrls: [] +}) +export class ClassicViewUiComponent { + +} diff --git a/core/app/ui/components/classic-view/classic-view.module.ts b/core/app/ui/components/classic-view/classic-view.module.ts new file mode 100644 index 000000000..213db2fe5 --- /dev/null +++ b/core/app/ui/components/classic-view/classic-view.module.ts @@ -0,0 +1,22 @@ +import {NgModule} from '@angular/core'; +import {CommonModule} from '@angular/common'; +import {RouterModule} from '@angular/router'; +import {AppManagerModule} from '../../../../app-manager/app-manager.module'; +import {ClassicViewUiComponent} from './classic-view.component'; +import {ClassicViewUiRoutes} from './classic-view.routes'; + +@NgModule({ + declarations: [ + ClassicViewUiComponent + ], + exports: [ + ClassicViewUiComponent + ], + imports: [ + AppManagerModule.forChild(ClassicViewUiComponent), + RouterModule.forChild(ClassicViewUiRoutes), + CommonModule + ] +}) +export class ClassicViewUiModule { +} \ No newline at end of file diff --git a/core/app/ui/components/classic-view/classic-view.routes.ts b/core/app/ui/components/classic-view/classic-view.routes.ts new file mode 100644 index 000000000..2245df65d --- /dev/null +++ b/core/app/ui/components/classic-view/classic-view.routes.ts @@ -0,0 +1,9 @@ +import {Route} from '@angular/router'; +import {ClassicViewUiComponent} from './classic-view.component' + +export const ClassicViewUiRoutes: Route[] = [ + { + path: '', + component: ClassicViewUiComponent + } +]; \ No newline at end of file diff --git a/core/app/ui/components/footer/footer.component.html b/core/app/ui/components/footer/footer.component.html new file mode 100644 index 000000000..51bb866a2 --- /dev/null +++ b/core/app/ui/components/footer/footer.component.html @@ -0,0 +1,101 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/core/app/ui/components/footer/footer.component.spec.ts b/core/app/ui/components/footer/footer.component.spec.ts new file mode 100644 index 000000000..5dc8f5451 --- /dev/null +++ b/core/app/ui/components/footer/footer.component.spec.ts @@ -0,0 +1,31 @@ +import {async, ComponentFixture, TestBed, inject} from '@angular/core/testing'; +import {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'; +import {FormsModule} from '@angular/forms'; +import {RouterTestingModule} from '@angular/router/testing'; +import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing'; + +import {FooterUiComponent} from './footer.component'; + +describe('FooterUiComponent', () => { + let component: FooterUiComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + schemas: [CUSTOM_ELEMENTS_SCHEMA], + imports: [RouterTestingModule, HttpClientTestingModule, FormsModule], + declarations: [FooterUiComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(FooterUiComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/core/app/ui/components/footer/footer.component.ts b/core/app/ui/components/footer/footer.component.ts new file mode 100644 index 000000000..828c5d1ec --- /dev/null +++ b/core/app/ui/components/footer/footer.component.ts @@ -0,0 +1,59 @@ +import {Component, OnInit} from '@angular/core'; + +import {NgbModal, ModalDismissReasons} from '@ng-bootstrap/ng-bootstrap'; + +@Component({ + selector: 'scrm-footer-ui', + templateUrl: './footer.component.html', + styleUrls: [] +}) +export class FooterUiComponent implements OnInit { + + closeResult: string; + + constructor(private modalService: NgbModal) { + } + + openSugarCopyright(sugarcopyright) { + this.modalService.open(sugarcopyright, { + ariaLabelledBy: 'modal-basic-title', + centered: true, + size: 'lg' + }).result.then((result) => { + this.closeResult = `Closed with: ${result}`; + }, (reason) => { + this.closeResult = `Dismissed ${this.getDismissReason(reason)}`; + }); + } + + openSuiteCopyright(suitecopyright) { + this.modalService.open(suitecopyright, { + ariaLabelledBy: 'modal-basic-title', + centered: true, + size: 'lg' + }).result.then((result) => { + this.closeResult = `Closed with: ${result}`; + }, (reason) => { + this.closeResult = `Dismissed ${this.getDismissReason(reason)}`; + }); + } + + private getDismissReason(reason: any): string { + if (reason === ModalDismissReasons.ESC) { + return 'by pressing ESC'; + } else if (reason === ModalDismissReasons.BACKDROP_CLICK) { + return 'by clicking on a backdrop'; + } else { + return `with: ${reason}`; + } + } + + backToTop() { + document.body.scrollTop = 0; // For Safari + document.documentElement.scrollTop = 0; // For Chrome, Firefox, IE and Opera + } + + ngOnInit() { + } + +} diff --git a/core/app/ui/components/footer/footer.module.ts b/core/app/ui/components/footer/footer.module.ts new file mode 100644 index 000000000..f6b450a5d --- /dev/null +++ b/core/app/ui/components/footer/footer.module.ts @@ -0,0 +1,19 @@ +import {NgModule, CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'; +import {CommonModule} from '@angular/common'; + +import {AppManagerModule} from '../../../../app-manager/app-manager.module'; +import {FooterUiComponent} from './footer.component'; +import {SvgIconUiModule} from '../svg-icon/svg-icon.module'; + + +@NgModule({ + declarations: [FooterUiComponent], + exports: [FooterUiComponent], + imports: [ + CommonModule, + AppManagerModule.forChild(FooterUiComponent), + SvgIconUiModule + ] +}) +export class FooterUiModule { +} \ No newline at end of file diff --git a/core/app/ui/components/home/home.component.html b/core/app/ui/components/home/home.component.html new file mode 100644 index 000000000..d19fb188b --- /dev/null +++ b/core/app/ui/components/home/home.component.html @@ -0,0 +1,3 @@ +
+

Home Page

+
\ No newline at end of file diff --git a/core/app/ui/components/home/home.component.spec.ts b/core/app/ui/components/home/home.component.spec.ts new file mode 100644 index 000000000..b895049bc --- /dev/null +++ b/core/app/ui/components/home/home.component.spec.ts @@ -0,0 +1,33 @@ +import {async, ComponentFixture, TestBed, inject} from '@angular/core/testing'; +import {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'; +import {FormsModule} from '@angular/forms'; +import {RouterTestingModule} from '@angular/router/testing'; +import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing'; + +import {HomeUiComponent} from './home.component'; +import {ApiService} from '../../services/api/api.service'; + +describe('HomeUiComponent', () => { + let component: HomeUiComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + schemas: [CUSTOM_ELEMENTS_SCHEMA], + imports: [RouterTestingModule, HttpClientTestingModule, FormsModule], + declarations: [HomeUiComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(HomeUiComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it(`should create`, async(inject([HttpTestingController], + (router: RouterTestingModule, http: HttpTestingController, api: ApiService) => { + expect(component).toBeTruthy(); + }))); +}); diff --git a/core/app/ui/components/home/home.component.ts b/core/app/ui/components/home/home.component.ts new file mode 100644 index 000000000..5f8ff5539 --- /dev/null +++ b/core/app/ui/components/home/home.component.ts @@ -0,0 +1,16 @@ +import {Component} from '@angular/core'; +import {Router} from '@angular/router'; + +import {AuthService} from '../../services/auth/auth.service'; +import {LoginResponseModel} from '../../services/auth/login-response-model'; +import {MessageService} from '../../services/message/message.service'; +import {ApiService} from '../../services/api/api.service'; + +@Component({ + selector: 'scrm-home-ui', + templateUrl: './home.component.html', + styleUrls: [] +}) +export class HomeUiComponent { + +} diff --git a/core/app/ui/components/home/home.module.ts b/core/app/ui/components/home/home.module.ts new file mode 100644 index 000000000..e770de6ca --- /dev/null +++ b/core/app/ui/components/home/home.module.ts @@ -0,0 +1,26 @@ +import {NgModule} from '@angular/core'; +import {CommonModule} from '@angular/common'; +import {RouterModule} from '@angular/router'; +import {AppManagerModule} from '../../../../app-manager/app-manager.module'; +import {HomeUiComponent} from './home.component'; +import {HomeUiRoutes} from './home.routes'; +import {NavbarUiModule} from '../navbar/navbar.module'; +import {FooterUiModule} from '../footer/footer.module'; + +@NgModule({ + declarations: [ + HomeUiComponent + ], + exports: [ + HomeUiComponent + ], + imports: [ + AppManagerModule.forChild(HomeUiComponent), + RouterModule.forChild(HomeUiRoutes), + NavbarUiModule, + FooterUiModule, + CommonModule + ] +}) +export class HomeUiModule { +} \ No newline at end of file diff --git a/core/app/ui/components/home/home.routes.ts b/core/app/ui/components/home/home.routes.ts new file mode 100644 index 000000000..8f2c9eb21 --- /dev/null +++ b/core/app/ui/components/home/home.routes.ts @@ -0,0 +1,19 @@ +import {Route} from '@angular/router'; +import {HomeUiComponent} from './home.component' +import {NavbarUiComponent} from '../navbar/navbar.component'; +import {FooterUiComponent} from '../footer/footer.component'; + +export const HomeUiRoutes: Route[] = [ + { + path: '', + component: HomeUiComponent + }, + { + path: '', + component: NavbarUiComponent + }, + { + path: '', + component: FooterUiComponent + } +]; \ No newline at end of file diff --git a/core/app/ui/components/list-view/list-view-column-model.ts b/core/app/ui/components/list-view/list-view-column-model.ts new file mode 100644 index 000000000..3713d1b05 --- /dev/null +++ b/core/app/ui/components/list-view/list-view-column-model.ts @@ -0,0 +1,21 @@ +export interface ListViewColumnModel { + key: string; + audited: boolean; + comment: string; + dbType: string; + default: boolean; + fullTextSearch: { + boost: number; + }; + importable: string; + label: string; + len: number; + link: boolean; + mergeFilter: string; + name: string; + required: boolean; + type: string; + unifiedSearch: boolean; + vname: string; + width: number; +} diff --git a/core/app/ui/components/list-view/list-view-data-model.ts b/core/app/ui/components/list-view/list-view-data-model.ts new file mode 100644 index 000000000..ede4a18a1 --- /dev/null +++ b/core/app/ui/components/list-view/list-view-data-model.ts @@ -0,0 +1,27 @@ +import {ListViewColumnModel} from './list-view-column-model'; + +export interface ListViewRowModel { + selected: boolean; + id: string; + data: any; +} + +export interface ListViewDataModel { + module: string; + columns: ListViewColumnModel[]; + orderby?: string; + desc?: boolean; + maxpage: number; + page: number; + rows: ListViewRowModel[]; +} + +export class ListViewData implements ListViewDataModel { + module: string = null; + columns: ListViewColumnModel[]; + orderby = ''; + desc: boolean = null; + maxpage: number; + page = 1; + rows: ListViewRowModel[]; +} diff --git a/core/app/ui/components/list-view/list-view.component.html b/core/app/ui/components/list-view/list-view.component.html new file mode 100644 index 000000000..bbd2fc670 --- /dev/null +++ b/core/app/ui/components/list-view/list-view.component.html @@ -0,0 +1,521 @@ + + +
+ + + +
+ +
+
+
+
+
+ + +
+
+
+
+
+
+

{{ listViewData.module }}

+
+
+
+
+
+
+ + + + + +
+
+
+
+
+
+ +
+
+

{{ listViewData.module }}

+
+
+
+
+
+ + +
+
+
+
+ + + + + +
+
+
+
+
+
+
+ + + + + +
+
+ + + +
+ + + +
+
+ +
+
+ + + + (1- 20 of 200) + + + +
+
+
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + {{ title.label }} + + + + + +
+ + + + + + + +
+ {{ title.label }} + {{ row[title.key] }} + + + + + + + +
+ + {{ title.label }} + + + + + +
+ + + + + + + + + + + + +
+
+ + + + + + +
+ + + + + +
+
+
+

+ Quick Charts + + +

+
+ +
+
+
+ +
+
+
+
+
+ +
+ Pipeline Chart +
+
+
+
+
+ +
+ Donut Chart +
+
+
+
+
+
+ + +
+
+
+
+
+ + + +
+
+ + + +
+ + \ No newline at end of file diff --git a/core/app/ui/components/list-view/list-view.component.spec.ts b/core/app/ui/components/list-view/list-view.component.spec.ts new file mode 100644 index 000000000..f92e0d7d7 --- /dev/null +++ b/core/app/ui/components/list-view/list-view.component.spec.ts @@ -0,0 +1,63 @@ +import {async, ComponentFixture, TestBed} from '@angular/core/testing'; + +import {CommonModule} from '@angular/common'; + +import {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'; + +import {RouterTestingModule} from '@angular/router/testing'; + +import {PluginManagerModule} from '../../../../plugin-manager/plugin-manager.module'; + +import {SharedModule} from '../../../../themes/shared/shared.module'; + +import {Router} from '@angular/router'; +import {HttpClientModule} from '@angular/common/http'; + +import {ListViewComponent} from './list-view.component'; +import {SvgIconComponent} from '../svg-icon/svg-icon.component'; +import {ModalViewComponent} from '../modal-view/modal-view.component'; + +let mockRouter: any; + +class MockRouter { + navigate = jasmine.createSpy('navigate'); +} + +export const testImports = [ + CommonModule, + RouterTestingModule, + HttpClientModule, + SharedModule, + PluginManagerModule.forChild(ListViewComponent), +]; + +describe('ListViewComponent', () => { + let component: ListViewComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [], + imports: testImports, + providers: [{provide: Router, useValue: mockRouter}], + schemas: [CUSTOM_ELEMENTS_SCHEMA] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ListViewComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should default to ascending', () => { + expect(component.desc).toBe('ASC'); + }); + + it('should toggle to descending', () => { + component.order('city'); + component.order('city'); + expect(component.desc).toBe('DESC'); + }); +}); diff --git a/core/app/ui/components/list-view/list-view.component.ts b/core/app/ui/components/list-view/list-view.component.ts new file mode 100644 index 000000000..0cfd6ea1a --- /dev/null +++ b/core/app/ui/components/list-view/list-view.component.ts @@ -0,0 +1,131 @@ +import {HttpClient} from "@angular/common/http"; +import {Component, OnInit, Input, HostListener} from "@angular/core"; +import {ListViewData, ListViewDataModel} from "./list-view-data-model"; +import {ApiService} from "../../services/api/api.service"; +import {trigger, style, animate, transition} from "@angular/animations"; + +@Component({ + selector: "scrm-list-view-ui", + templateUrl: "./list-view.component.html", + styleUrls: [], + animations: [ + trigger("widgetFade", [ + transition("void => *", [ + style({transform: "translateX(100%)", opacity: 0}), + animate("500ms", style({transform: "translateX(0)", opacity: 1})) + ]), + transition("* => void", [ + style({transform: "translateX(0)", opacity: 1}), + animate("500ms", style({transform: "translateX(100%)", opacity: 0})) + ]) + ]), + trigger("widgetContentFade", [ + transition("void => *", [ + style({transform: "translateY(-5%)", opacity: 0}), + animate("500ms", style({transform: "translateY(0)", opacity: 1})) + ]), + transition("* => void", [ + style({transform: "translateY(0)", opacity: 1}), + animate("500ms", style({transform: "translateY(-5%)", opacity: 0})) + ]) + ]) + ] +}) +export class ListViewUiComponent implements OnInit { + listViewData: ListViewData = new ListViewData(); + + @Input() set module(module: string) { + this.listViewData.module = module; + } + + displayWidgets: boolean = true; + displayWidgetContent: boolean = true; + displayResponsiveTable: boolean = false; + showCollapsed: boolean = false; + widgetHeaderToggleIcon: string = "minimise_circled.svg"; + tableToggleIcon: string = "mobile_expand_icon.svg"; + listViewFullWidth: boolean = true; + listViewIconUnsorted: string = "sort.svg"; + listViewIconSorted: string = "sort_descend.svg"; + + orderBy: string = "date_entered"; + desc: string = "ASC"; + allSelected: boolean = false; + + @HostListener("window:resize", ["$event"]) + onResize(event: any) { + event.target.innerWidth; + if (innerWidth <= 768) { + this.displayResponsiveTable = true; + } else { + this.displayResponsiveTable = false; + } + } + + expandRow(row) { + row.expanded = !row.expanded; + } + + toggleWidgets() { + this.displayWidgets = !this.displayWidgets; + this.listViewFullWidth = !this.listViewFullWidth; + } + + toggleWidgetContent() { + if (this.widgetHeaderToggleIcon == "minimise_circled.svg") { + this.widgetHeaderToggleIcon = "plus_thin.svg"; + this.displayWidgetContent = false; + } else { + this.widgetHeaderToggleIcon = "minimise_circled.svg"; + this.displayWidgetContent = true; + } + } + + constructor(protected api: ApiService, protected http: HttpClient) { + } + + ngOnInit() { + window.dispatchEvent(new Event("resize")); + + // const options: LegacyEntryUrlOptionsModel = {}; + // this.http.get(this.legacyApi.getLegacyEntryUrl(options)); + // this.loadList(); + } + + loadList() { + this.api.getListViewData( + this.listViewData, + (listViewData: ListViewData) => { + this.listViewData = listViewData; + }, + this.orderBy, + this.desc + ); + } + + order(key: string) { + if (this.orderBy == key) { + this.desc = this.desc == "ASC" ? "DESC" : "ASC"; + } else { + this.desc = "ASC"; + } + + if (this.orderBy == key && this.desc == "DESC") { + this.listViewIconSorted = "sort_ascend.svg"; + } else if (this.orderBy == key && this.desc == "ASC") { + this.listViewIconSorted = "sort_descend.svg"; + } + + this.orderBy = key; + + this.loadList(); + } + + selectAll() { + this.allSelected = true; + } + + deselectAll() { + this.allSelected = false; + } +} diff --git a/core/app/ui/components/list-view/list-view.module.ts b/core/app/ui/components/list-view/list-view.module.ts new file mode 100644 index 000000000..32607d4bd --- /dev/null +++ b/core/app/ui/components/list-view/list-view.module.ts @@ -0,0 +1,22 @@ +import {NgModule, CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'; +import {CommonModule} from '@angular/common'; + +import {AppManagerModule} from '../../../../app-manager/app-manager.module'; +import {ListViewUiComponent} from './list-view.component'; +import {SvgIconUiModule} from '../svg-icon/svg-icon.module'; +import {ModalViewUiModule} from '../modal-view/modal-view.module'; +import {FieldModule} from '../../../fields/field.module'; + +@NgModule({ + declarations: [ListViewUiComponent], + exports: [ListViewUiComponent], + imports: [ + CommonModule, + AppManagerModule.forChild(ListViewUiComponent), + SvgIconUiModule, + FieldModule, + ModalViewUiModule + ] +}) +export class ListViewUiModule { +} \ No newline at end of file diff --git a/core/app/ui/components/login/login.component.html b/core/app/ui/components/login/login.component.html new file mode 100644 index 000000000..2ffbcc2f1 --- /dev/null +++ b/core/app/ui/components/login/login.component.html @@ -0,0 +1,30 @@ +
+ + + + + + + +
+ + \ No newline at end of file diff --git a/core/app/ui/components/login/login.component.spec.ts b/core/app/ui/components/login/login.component.spec.ts new file mode 100644 index 000000000..3b59b3037 --- /dev/null +++ b/core/app/ui/components/login/login.component.spec.ts @@ -0,0 +1,33 @@ +import {async, ComponentFixture, TestBed, inject} from '@angular/core/testing'; +import {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'; +import {FormsModule} from '@angular/forms'; +import {RouterTestingModule} from '@angular/router/testing'; +import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing'; + +import {LoginComponent} from './login.component'; +import {ApiService} from '../../services/api/api.service'; + +describe('LoginComponent', () => { + let component: LoginComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + schemas: [CUSTOM_ELEMENTS_SCHEMA], + imports: [RouterTestingModule, HttpClientTestingModule, FormsModule], + declarations: [LoginComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(LoginComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it(`should create`, async(inject([HttpTestingController], + (router: RouterTestingModule, http: HttpTestingController, api: ApiService) => { + expect(component).toBeTruthy(); + }))); +}); diff --git a/core/app/ui/components/login/login.component.ts b/core/app/ui/components/login/login.component.ts new file mode 100644 index 000000000..2f57b4edf --- /dev/null +++ b/core/app/ui/components/login/login.component.ts @@ -0,0 +1,50 @@ +import {Component} from '@angular/core'; +import {Router} from '@angular/router'; + +import {AuthService} from '../../services/auth/auth.service'; +import {LoginResponseModel} from '../../services/auth/login-response-model'; +import {MessageService} from '../../services/message/message.service'; +import {ApiService} from '../../services/api/api.service'; + +@Component({ + selector: 'scrm-login-ui', + templateUrl: './login.component.html', + styleUrls: [] +}) +export class LoginUiComponent { + hidden = true; + error = ''; + uname = ''; + passw = ''; + + /** + * + * @param legacyApi LegacyApiService + * @param router Router + * @param auth AuthService + * @param message MessageService + */ + constructor( + protected api: ApiService, + protected router: Router, + protected auth: AuthService, + protected message: MessageService + ) { + this.hidden = false; + } + + doLogin() { + this.auth.doLogin(this, this.uname, this.passw, this.onLoginSuccess, this.onLoginError); + } + + onLoginSuccess(caller: LoginUiComponent, loginResponse: LoginResponseModel) { + caller.message.log('OAuth2 login success'); + caller.router.navigate(['/Home']); + return; + } + + onLoginError(caller: LoginUiComponent, errorResponse: any) { + caller.message.log('OAuth2 login failed'); + caller.message.addDangerMessage('Login credentials incorrect, please try again.'); + } +} diff --git a/core/app/ui/components/login/login.module.ts b/core/app/ui/components/login/login.module.ts new file mode 100644 index 000000000..d57466e9e --- /dev/null +++ b/core/app/ui/components/login/login.module.ts @@ -0,0 +1,29 @@ +import {NgModule, CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'; +import {CommonModule} from '@angular/common'; +import {FormsModule, ReactiveFormsModule} from '@angular/forms'; +import {RouterModule} from '@angular/router'; +import {AppManagerModule} from '../../../../app-manager/app-manager.module'; +import {LoginUiComponent} from './login.component'; +import {LogoUiModule} from '../logo/logo.module'; +import {SvgIconUiModule} from '../svg-icon/svg-icon.module'; +import {HomeUiModule} from '../home/home.module'; +import {LoginUiRoutes} from './login.routes'; + +@NgModule({ + declarations: [ + LoginUiComponent + ], + exports: [ + LoginUiComponent + ], + imports: [ + FormsModule, + LogoUiModule, + SvgIconUiModule, + AppManagerModule.forChild(LoginUiComponent), + RouterModule.forChild(LoginUiRoutes), + CommonModule, + ] +}) +export class LoginUiModule { +} \ No newline at end of file diff --git a/core/app/ui/components/login/login.routes.ts b/core/app/ui/components/login/login.routes.ts new file mode 100644 index 000000000..7ec730a87 --- /dev/null +++ b/core/app/ui/components/login/login.routes.ts @@ -0,0 +1,10 @@ +import {Route} from '@angular/router'; +import {LoginUiComponent} from './login.component' +import {HomeUiComponent} from '../home/home.component'; + +export const LoginUiRoutes: Route[] = [ + { + path: '', + component: LoginUiComponent + } +]; \ No newline at end of file diff --git a/core/app/ui/components/logo/logo.component.html b/core/app/ui/components/logo/logo.component.html new file mode 100644 index 000000000..09372e7d0 --- /dev/null +++ b/core/app/ui/components/logo/logo.component.html @@ -0,0 +1 @@ +SuiteCRM Logo \ No newline at end of file diff --git a/core/app/ui/components/logo/logo.component.spec.ts b/core/app/ui/components/logo/logo.component.spec.ts new file mode 100644 index 000000000..d0bdab4f4 --- /dev/null +++ b/core/app/ui/components/logo/logo.component.spec.ts @@ -0,0 +1,31 @@ +import {async, ComponentFixture, TestBed, inject} from '@angular/core/testing'; +import {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'; +import {RouterTestingModule} from '@angular/router/testing'; +import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing'; + + +import {LogoComponent} from './logo.component'; + +describe('LogoComponent', () => { + let component: LogoComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + schemas: [CUSTOM_ELEMENTS_SCHEMA], + imports: [RouterTestingModule, HttpClientTestingModule], + declarations: [LogoComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(LogoComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/core/app/ui/components/logo/logo.component.ts b/core/app/ui/components/logo/logo.component.ts new file mode 100644 index 000000000..220d94cc7 --- /dev/null +++ b/core/app/ui/components/logo/logo.component.ts @@ -0,0 +1,10 @@ +import {Component, OnInit} from '@angular/core'; +import {HttpClient} from '@angular/common/http'; + +@Component({ + selector: 'scrm-logo-ui', + templateUrl: './logo.component.html', + styleUrls: [] +}) +export class LogoUiComponent { +} diff --git a/core/app/ui/components/logout/logout.component.html b/core/app/ui/components/logout/logout.component.html new file mode 100644 index 000000000..d7c778310 --- /dev/null +++ b/core/app/ui/components/logout/logout.component.html @@ -0,0 +1,2 @@ +Logout + \ No newline at end of file diff --git a/core/app/ui/components/logout/logout.component.spec.ts b/core/app/ui/components/logout/logout.component.spec.ts new file mode 100644 index 000000000..8f83f3486 --- /dev/null +++ b/core/app/ui/components/logout/logout.component.spec.ts @@ -0,0 +1,30 @@ +import {async, ComponentFixture, TestBed, inject} from '@angular/core/testing'; +import {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'; +import {RouterTestingModule} from '@angular/router/testing'; +import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing'; + +import {LogoutComponent} from './logout.component'; + +describe('LogoutComponent', () => { + let component: LogoutComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + schemas: [CUSTOM_ELEMENTS_SCHEMA], + imports: [RouterTestingModule, HttpClientTestingModule], + declarations: [LogoutComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(LogoutComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/core/app/ui/components/logout/logout.component.ts b/core/app/ui/components/logout/logout.component.ts new file mode 100644 index 000000000..774b2460e --- /dev/null +++ b/core/app/ui/components/logout/logout.component.ts @@ -0,0 +1,40 @@ +import {HttpErrorResponse} from '@angular/common/http'; +import {Component, OnInit} from '@angular/core'; +import {Router} from '@angular/router'; +import {AuthService} from '../../services/auth/auth.service'; +import {MessageService} from '../../services/message/message.service'; +import {NavbarUiComponent} from '../navbar/navbar.component'; +import {ApiService} from '../../services/api/api.service'; + +@Component({ + selector: 'scrm-logo-ui-ui', + templateUrl: './logout.component.html', + styleUrls: [] +}) +export class LogoutUiComponent implements OnInit { + + constructor( + public api: ApiService, + public router: Router, + public auth: AuthService, + public message: MessageService + ) { + } + + ngOnInit() { + + } + + doLogout() { + + } + + onLogoutSuccess(caller: LogoutUiComponent) { + caller.message.log('New OAuth2 logout success'); + } + + onLogoutError(caller: LogoutUiComponent, errorResponse: HttpErrorResponse) { + caller.message.log('New OAuth2 logout failed'); + } + +} diff --git a/core/app/ui/components/message/message-type.ts b/core/app/ui/components/message/message-type.ts new file mode 100644 index 000000000..025243ab8 --- /dev/null +++ b/core/app/ui/components/message/message-type.ts @@ -0,0 +1,6 @@ +import {MessageTypes} from "./message-types.enum"; + +export interface MessageType { + type: MessageTypes; + text: string; +} diff --git a/core/app/ui/components/message/message-types.enum.ts b/core/app/ui/components/message/message-types.enum.ts new file mode 100644 index 000000000..e85e97d9c --- /dev/null +++ b/core/app/ui/components/message/message-types.enum.ts @@ -0,0 +1,11 @@ +// bootstrap css alert types +export enum MessageTypes { + primary = 'alert alert-primary', + secondary = 'alert alert-secondary', + success = 'alert alert-success', + danger = 'alert alert-danger', + warning = 'alert alert-warning', + info = 'alert alert-info', + light = 'alert alert-light', + dark = 'alert alert-dark' +} diff --git a/core/app/ui/components/message/message.component.html b/core/app/ui/components/message/message.component.html new file mode 100644 index 000000000..a82f03799 --- /dev/null +++ b/core/app/ui/components/message/message.component.html @@ -0,0 +1,8 @@ +
+ +
\ No newline at end of file diff --git a/core/app/ui/components/message/message.component.spec.ts b/core/app/ui/components/message/message.component.spec.ts new file mode 100644 index 000000000..f006c2591 --- /dev/null +++ b/core/app/ui/components/message/message.component.spec.ts @@ -0,0 +1,25 @@ +import {async, ComponentFixture, TestBed} from '@angular/core/testing'; + +import {MessageComponent} from './message.component'; + +describe('MessageComponent', () => { + let component: MessageComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [MessageComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(MessageComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/core/app/ui/components/message/message.component.ts b/core/app/ui/components/message/message.component.ts new file mode 100644 index 000000000..1863deee5 --- /dev/null +++ b/core/app/ui/components/message/message.component.ts @@ -0,0 +1,31 @@ +import {Component, OnInit} from '@angular/core'; +import {MessageService} from '../../services/message/message.service'; +import {MessageType} from './message-type'; + + +@Component({ + selector: 'scrm-message-ui', + templateUrl: './message.component.html', + styleUrls: [] +}) +export class MessageUiComponent implements OnInit { + + messages: Array = []; + + constructor(public messageService: MessageService) { + messageService.subscribe(this); + } + + ngOnInit() { + this.update(this.messageService.messages); + } + + update(messages: Array) { + this.messages = messages; + } + + close(message: MessageType) { + this.messageService.contains(message, true); + } + +} diff --git a/core/app/ui/components/modal-view/modal-view.component.html b/core/app/ui/components/modal-view/modal-view.component.html new file mode 100644 index 000000000..eca386599 --- /dev/null +++ b/core/app/ui/components/modal-view/modal-view.component.html @@ -0,0 +1,165 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/app/ui/components/modal-view/modal-view.component.spec.ts b/core/app/ui/components/modal-view/modal-view.component.spec.ts new file mode 100644 index 000000000..37ccd6d95 --- /dev/null +++ b/core/app/ui/components/modal-view/modal-view.component.spec.ts @@ -0,0 +1,25 @@ +import {async, ComponentFixture, TestBed} from '@angular/core/testing'; + +import {ModalViewComponent} from './modal-view.component'; + +describe('ModalViewComponent', () => { + let component: ModalViewComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ModalViewComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ModalViewComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + // it('should create', () => { + // expect(component).toBeTruthy(); + // }); +}); diff --git a/core/app/ui/components/modal-view/modal-view.component.ts b/core/app/ui/components/modal-view/modal-view.component.ts new file mode 100644 index 000000000..b45ae6fa4 --- /dev/null +++ b/core/app/ui/components/modal-view/modal-view.component.ts @@ -0,0 +1,54 @@ +import {Component, OnInit} from '@angular/core'; + +import {NgbModal, ModalDismissReasons} from '@ng-bootstrap/ng-bootstrap'; + +import { + trigger, + animate, + transition, +} from '@angular/animations'; + +@Component({ + selector: 'scrm-modal-view-ui', + templateUrl: './modal-view.component.html', + animations: [ + trigger('modalFade', [ + transition('void <=> *', [ + animate('800ms') + ]), + ]), + ] +}) + +export class ModalViewUiComponent implements OnInit { + closeResult: string; + + constructor(private modalService: NgbModal) { + } + + open(modal) { + this.modalService.open(modal, { + ariaLabelledBy: 'modal-basic-title', + centered: true, + size: 'lg' + }).result.then((result) => { + this.closeResult = `Closed with: ${result}`; + }, (reason) => { + this.closeResult = `Dismissed ${this.getDismissReason(reason)}`; + }); + } + + private getDismissReason(reason: any): string { + if (reason === ModalDismissReasons.ESC) { + return 'by pressing ESC'; + } else if (reason === ModalDismissReasons.BACKDROP_CLICK) { + return 'by clicking on a backdrop'; + } else { + return `with: ${reason}`; + } + } + + ngOnInit() { + } + +} diff --git a/core/app/ui/components/modal-view/modal-view.module.ts b/core/app/ui/components/modal-view/modal-view.module.ts new file mode 100644 index 000000000..11b220150 --- /dev/null +++ b/core/app/ui/components/modal-view/modal-view.module.ts @@ -0,0 +1,19 @@ +import {NgModule, CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'; +import {CommonModule} from '@angular/common'; + +import {AppManagerModule} from '../../../../app-manager/app-manager.module'; +import {ModalViewUiComponent} from './modal-view.component'; + +import {SvgIconUiModule} from '../svg-icon/svg-icon.module'; + +@NgModule({ + declarations: [ModalViewUiComponent], + exports: [ModalViewUiComponent], + imports: [ + CommonModule, + AppManagerModule.forChild(ModalViewUiComponent), + SvgIconUiModule + ] +}) +export class ModalViewUiModule { +} \ No newline at end of file diff --git a/core/app/ui/components/navbar/action-link-model.ts b/core/app/ui/components/navbar/action-link-model.ts new file mode 100644 index 000000000..4f19ac8d4 --- /dev/null +++ b/core/app/ui/components/navbar/action-link-model.ts @@ -0,0 +1,8 @@ +import {LinkModel} from './link-model'; +import {RecentRecordModel} from "./recent-record-model"; + +export interface ActionLinkModel { + link: LinkModel; + submenu?: Array; + recentRecords?: Array; +} diff --git a/core/app/ui/components/navbar/all-menu-model.ts b/core/app/ui/components/navbar/all-menu-model.ts new file mode 100644 index 000000000..1f3b61bf0 --- /dev/null +++ b/core/app/ui/components/navbar/all-menu-model.ts @@ -0,0 +1,6 @@ +import {ActionLinkModel} from './action-link-model'; + +export interface AllMenuModel { + modules: Array; + extra: Array; +} diff --git a/core/app/ui/components/navbar/current-user-model.ts b/core/app/ui/components/navbar/current-user-model.ts new file mode 100644 index 000000000..bcc0605f0 --- /dev/null +++ b/core/app/ui/components/navbar/current-user-model.ts @@ -0,0 +1,4 @@ +export interface CurrentUserModel { + id: string; + name: string; +} diff --git a/core/app/ui/components/navbar/link-model.ts b/core/app/ui/components/navbar/link-model.ts new file mode 100644 index 000000000..19e8c261c --- /dev/null +++ b/core/app/ui/components/navbar/link-model.ts @@ -0,0 +1,9 @@ +import {IconRefModel} from '../svg-icon/icon-ref-model'; +import {LinkTarget} from './link-target'; + +export class LinkModel { + iconRef?: IconRefModel; + label: string | undefined; + url: string | undefined; + target?: LinkTarget = LinkTarget.none; +} diff --git a/core/app/ui/components/navbar/link-target.ts b/core/app/ui/components/navbar/link-target.ts new file mode 100644 index 000000000..920526721 --- /dev/null +++ b/core/app/ui/components/navbar/link-target.ts @@ -0,0 +1,7 @@ +export enum LinkTarget { + none = '', + blank = '_blank', + parent = '_parent', + self = '_self', + top = '_top' +} diff --git a/core/app/ui/components/navbar/navbar.component.html b/core/app/ui/components/navbar/navbar.component.html new file mode 100644 index 000000000..0391949c3 --- /dev/null +++ b/core/app/ui/components/navbar/navbar.component.html @@ -0,0 +1,191 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/app/ui/components/navbar/navbar.component.spec.ts b/core/app/ui/components/navbar/navbar.component.spec.ts new file mode 100644 index 000000000..d8c9d63e5 --- /dev/null +++ b/core/app/ui/components/navbar/navbar.component.spec.ts @@ -0,0 +1,31 @@ +import {async, ComponentFixture, TestBed, inject} from '@angular/core/testing'; +import {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'; +import {RouterTestingModule} from '@angular/router/testing'; +import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing'; + +import {NavbarComponent} from './navbar.component'; + +describe('NavbarComponent', () => { + let component: NavbarComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + schemas: [CUSTOM_ELEMENTS_SCHEMA], + imports: [RouterTestingModule, HttpClientTestingModule], + declarations: [NavbarComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(NavbarComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it(`should create`, async(inject([HttpTestingController], + (httpClient: HttpTestingController) => { + expect(component).toBeTruthy(); + }))); +}); diff --git a/core/app/ui/components/navbar/navbar.component.ts b/core/app/ui/components/navbar/navbar.component.ts new file mode 100644 index 000000000..c3848b4fa --- /dev/null +++ b/core/app/ui/components/navbar/navbar.component.ts @@ -0,0 +1,21 @@ +import {Component, OnInit} from '@angular/core'; +import {Router, NavigationEnd} from '@angular/router'; +import {ApiService} from '../../services/api/api.service'; + +@Component({ + selector: 'scrm-navbar-ui', + templateUrl: './navbar.component.html', + styleUrls: [] +}) +export class NavbarUiComponent implements OnInit { + protected navbar: any = {}; + + protected loaded = true; + + constructor(protected api: ApiService, protected router: Router) { + } + + ngOnInit(): void { + this.navbar.authenticated = false; + } +} diff --git a/core/app/ui/components/navbar/navbar.module.ts b/core/app/ui/components/navbar/navbar.module.ts new file mode 100644 index 000000000..2c1270000 --- /dev/null +++ b/core/app/ui/components/navbar/navbar.module.ts @@ -0,0 +1,26 @@ +import {NgModule, CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'; +import {CommonModule} from '@angular/common'; + +import {AppManagerModule} from '../../../../app-manager/app-manager.module'; +import {NavbarUiComponent} from './navbar.component'; + +import {LogoUiModule} from '../logo/logo.module'; +import {LogoutUiModule} from '../logout/logout.module'; +import {ActionBarUiModule} from '../action-bar/action-bar.module'; +import {SvgIconUiModule} from '../svg-icon/svg-icon.module'; + + +@NgModule({ + declarations: [NavbarUiComponent], + exports: [NavbarUiComponent], + imports: [ + CommonModule, + AppManagerModule.forChild(NavbarUiComponent), + SvgIconUiModule, + LogoUiModule, + LogoutUiModule, + ActionBarUiModule + ] +}) +export class NavbarUiModule { +} \ No newline at end of file diff --git a/core/app/ui/components/navbar/recent-record-model.ts b/core/app/ui/components/navbar/recent-record-model.ts new file mode 100644 index 000000000..3e1c0038d --- /dev/null +++ b/core/app/ui/components/navbar/recent-record-model.ts @@ -0,0 +1,10 @@ +export interface RecentRecordModel { + dateModified: string; + id: string; + icon: string; + itemId: string; + itemSummary: string; + itemSummaryShort: string; + moduleName: string; + monitorId: string; +} diff --git a/core/app/ui/components/svg-icon/icon-ref-model.ts b/core/app/ui/components/svg-icon/icon-ref-model.ts new file mode 100644 index 000000000..f43bdac0e --- /dev/null +++ b/core/app/ui/components/svg-icon/icon-ref-model.ts @@ -0,0 +1,4 @@ +export interface IconRefModel { + resolved: string; + origin: string; +} diff --git a/core/app/ui/components/svg-icon/svg-filename-map-model.ts b/core/app/ui/components/svg-icon/svg-filename-map-model.ts new file mode 100644 index 000000000..38857c114 --- /dev/null +++ b/core/app/ui/components/svg-icon/svg-filename-map-model.ts @@ -0,0 +1,4 @@ +export interface SvgFilenameMapModel { + iconId: string; + fileName: string; +} diff --git a/core/app/ui/components/svg-icon/svg-icon.component.html b/core/app/ui/components/svg-icon/svg-icon.component.html new file mode 100644 index 000000000..7fefda9c3 --- /dev/null +++ b/core/app/ui/components/svg-icon/svg-icon.component.html @@ -0,0 +1,3370 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/app/ui/components/svg-icon/svg-icon.component.spec.ts b/core/app/ui/components/svg-icon/svg-icon.component.spec.ts new file mode 100644 index 000000000..1db17e794 --- /dev/null +++ b/core/app/ui/components/svg-icon/svg-icon.component.spec.ts @@ -0,0 +1,25 @@ +import {async, ComponentFixture, TestBed} from '@angular/core/testing'; + +import {SvgIconComponent} from './svg-icon.component'; + +describe('SvgiconComponent', () => { + let component: SvgIconComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [SvgIconComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SvgIconComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/core/app/ui/components/svg-icon/svg-icon.component.ts b/core/app/ui/components/svg-icon/svg-icon.component.ts new file mode 100644 index 000000000..6cecd69c1 --- /dev/null +++ b/core/app/ui/components/svg-icon/svg-icon.component.ts @@ -0,0 +1,17 @@ +import {Component, OnInit, Input, ViewEncapsulation} from '@angular/core'; + +@Component({ + selector: 'scrm-svg-icon-ui', + templateUrl: './svg-icon.component.html', + styleUrls: [] +}) +export class SvgIconUiComponent implements OnInit { + @Input() file: string = ""; + + constructor() { + } + + ngOnInit() { + + } +} diff --git a/core/app/ui/components/user-action-menu/user-action-menu.component.html b/core/app/ui/components/user-action-menu/user-action-menu.component.html new file mode 100644 index 000000000..3c2d40f2a --- /dev/null +++ b/core/app/ui/components/user-action-menu/user-action-menu.component.html @@ -0,0 +1,4 @@ +

+ user-action-menu works! +

+
{{ model | json }}
diff --git a/core/app/ui/components/user-action-menu/user-action-menu.component.spec.ts b/core/app/ui/components/user-action-menu/user-action-menu.component.spec.ts new file mode 100644 index 000000000..73b77e636 --- /dev/null +++ b/core/app/ui/components/user-action-menu/user-action-menu.component.spec.ts @@ -0,0 +1,30 @@ +import {async, ComponentFixture, TestBed, inject} from '@angular/core/testing'; +import {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'; +import {RouterTestingModule} from '@angular/router/testing'; +import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing'; + +import {UserActionMenuComponent} from './user-action-menu.component'; + +describe('UserActionMenuComponent', () => { + let component: UserActionMenuComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + schemas: [CUSTOM_ELEMENTS_SCHEMA], + imports: [RouterTestingModule, HttpClientTestingModule], + declarations: [UserActionMenuComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(UserActionMenuComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/core/app/ui/components/user-action-menu/user-action-menu.component.ts b/core/app/ui/components/user-action-menu/user-action-menu.component.ts new file mode 100644 index 000000000..573432a13 --- /dev/null +++ b/core/app/ui/components/user-action-menu/user-action-menu.component.ts @@ -0,0 +1,19 @@ +import {Component, OnInit} from '@angular/core'; +import {HttpClient, HttpErrorResponse} from '@angular/common/http'; + +@Component({ + selector: 'scrm-user-action-menu-ui', + templateUrl: './user-action-menu.component.html', + styleUrls: [] +}) +export class UserActionMenuUiComponent implements OnInit { + + model = null; + + constructor(protected http: HttpClient) { + } + + ngOnInit() { + } + +} diff --git a/core/app/ui/pipes/keys.pipe.spec.ts b/core/app/ui/pipes/keys.pipe.spec.ts new file mode 100644 index 000000000..02f4aa50b --- /dev/null +++ b/core/app/ui/pipes/keys.pipe.spec.ts @@ -0,0 +1,8 @@ +import {KeysPipe} from './keys.pipe'; + +describe('KeysPipe', () => { + it('create an instance', () => { + const pipe = new KeysPipe(); + expect(pipe).toBeTruthy(); + }); +}); diff --git a/core/app/ui/pipes/keys.pipe.ts b/core/app/ui/pipes/keys.pipe.ts new file mode 100644 index 000000000..16a4ebcb7 --- /dev/null +++ b/core/app/ui/pipes/keys.pipe.ts @@ -0,0 +1,16 @@ +import {Pipe, PipeTransform} from '@angular/core'; + +@Pipe({ + name: 'keys' +}) +export class KeysPipe implements PipeTransform { + + transform(value: any, args?: any): any { + let keys = []; + for (let key in value) { + keys.push({key: key, value: value[key]}); + } + return keys; + } + +} diff --git a/core/app/ui/pipes/safe.pipe.ts b/core/app/ui/pipes/safe.pipe.ts new file mode 100644 index 000000000..49eb07a02 --- /dev/null +++ b/core/app/ui/pipes/safe.pipe.ts @@ -0,0 +1,12 @@ +import {PipeTransform, Pipe} from '@angular/core'; +import {DomSanitizer} from '@angular/platform-browser'; + +@Pipe({name: 'safe'}) +export class SafePipe implements PipeTransform { + constructor(private sanitizer: DomSanitizer) { + } + + transform(url) { + return this.sanitizer.bypassSecurityTrustResourceUrl(url); + } +} diff --git a/core/app/ui/services/api/api-access-token-response-empty.ts b/core/app/ui/services/api/api-access-token-response-empty.ts new file mode 100644 index 000000000..b672ececb --- /dev/null +++ b/core/app/ui/services/api/api-access-token-response-empty.ts @@ -0,0 +1,9 @@ +import {ApiAccessTokenResponseModel} from './api-access-token-response-model'; + +export class ApiAccessTokenResponseEmpty implements ApiAccessTokenResponseModel { + accessToken = ''; + expiresIn = 0; + tokenType = ''; + refreshToken = ''; + scope?: string[] = []; +} diff --git a/core/app/ui/services/api/api-access-token-response-model.ts b/core/app/ui/services/api/api-access-token-response-model.ts new file mode 100644 index 000000000..c955f5963 --- /dev/null +++ b/core/app/ui/services/api/api-access-token-response-model.ts @@ -0,0 +1,7 @@ +export interface ApiAccessTokenResponseModel { + accessToken: string; + expiresIn: number; + tokenType: string; + refreshToken: string; + scope?: string[]; +} diff --git a/core/app/ui/services/api/api-response-error-model.ts b/core/app/ui/services/api/api-response-error-model.ts new file mode 100644 index 000000000..735f20c7e --- /dev/null +++ b/core/app/ui/services/api/api-response-error-model.ts @@ -0,0 +1,3 @@ +export interface ApiResponseErrorModel { + message: string; +} diff --git a/core/app/ui/services/api/api-response-model.ts b/core/app/ui/services/api/api-response-model.ts new file mode 100644 index 000000000..bbc8c1dd4 --- /dev/null +++ b/core/app/ui/services/api/api-response-model.ts @@ -0,0 +1,8 @@ +import {ApiResponseErrorModel} from './api-response-error-model'; + +export interface ApiResponseModel { + error?: ApiResponseErrorModel; + meta?: any; + list?: any[]; + data?: any; +} diff --git a/core/app/ui/services/api/api-subscription-model.ts b/core/app/ui/services/api/api-subscription-model.ts new file mode 100644 index 000000000..0cf8cfca7 --- /dev/null +++ b/core/app/ui/services/api/api-subscription-model.ts @@ -0,0 +1,7 @@ +import {HttpErrorResponse} from '@angular/common/http'; +import {ApiResponseModel} from './api-response-model'; + +export interface ApiSubscriptionModel { + onSuccess: (response: ApiResponseModel) => void; + onError?: (error: HttpErrorResponse) => void; +} diff --git a/core/app/ui/services/api/api.service.spec.ts b/core/app/ui/services/api/api.service.spec.ts new file mode 100644 index 000000000..34b48436e --- /dev/null +++ b/core/app/ui/services/api/api.service.spec.ts @@ -0,0 +1,18 @@ +import {async, ComponentFixture, TestBed, inject} from '@angular/core/testing'; +import {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'; +import {FormsModule} from '@angular/forms'; +import {RouterTestingModule} from '@angular/router/testing'; +import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing'; +import {ApiService} from './api.service'; + +describe('ApiService', () => { + beforeEach(() => TestBed.configureTestingModule({ + schemas: [CUSTOM_ELEMENTS_SCHEMA], + imports: [RouterTestingModule, HttpClientTestingModule, FormsModule] + })); + + it('should be created', () => { + const service: ApiService = TestBed.get(ApiService); + expect(service).toBeTruthy(); + }); +}); diff --git a/core/app/ui/services/api/api.service.ts b/core/app/ui/services/api/api.service.ts new file mode 100644 index 000000000..35d016043 --- /dev/null +++ b/core/app/ui/services/api/api.service.ts @@ -0,0 +1,335 @@ +import {Injectable} from '@angular/core'; +import {KeyValue} from '@angular/common'; +import {HttpClient, HttpErrorResponse} from '@angular/common/http'; +import {Router} from '@angular/router'; +import {Observable} from 'rxjs'; +import * as hash from 'object-hash'; +import {MessageService} from '../message/message.service'; +import {SvgFilenameMapModel} from '../../components/svg-icon/svg-filename-map-model'; +import {ApiAccessTokenResponseModel} from './api-access-token-response-model'; +import {ApiResponseModel} from './api-response-model'; +import {ApiSubscriptionModel} from './api-subscription-model'; +import {LoginResponseModel} from '../auth/login-response-model'; +import {ApiAccessTokenResponseEmpty} from './api-access-token-response-empty'; +import {ListViewData, ListViewDataModel} from '../../components/list-view/list-view-data-model'; + +@Injectable({ + providedIn: 'root' +}) +export class ApiService { + + protected useCache: boolean = true; + + constructor( + protected router: Router, + protected http: HttpClient, + protected message: MessageService + ) { + + } + + protected static observables: KeyValue>[] = []; + protected static subscriptions: KeyValue[] = []; + + protected static accessTokenResponse: ApiAccessTokenResponseModel = new ApiAccessTokenResponseEmpty(); + + reset(response?: LoginResponseModel) { + ApiService.observables = []; + ApiService.subscriptions = []; + ApiService.accessTokenResponse = new ApiAccessTokenResponseEmpty(); + + if (response) { + ApiService.accessTokenResponse.accessToken = response.access_token; + ApiService.accessTokenResponse.expiresIn = response.expires_in; + ApiService.accessTokenResponse.tokenType = response.token_type; + ApiService.accessTokenResponse.refreshToken = response.refresh_token; + ApiService.accessTokenResponse.scope = response.scope ? response.scope : []; + } + } + + protected getObservablePending(hashKey: string): Observable | null { + for (const i in ApiService.observables) { + if (ApiService.observables[i].key === hashKey) { + return ApiService.observables[i].value; + } + } + return null; + } + + protected addObservable(hashKey: string, post: Observable): number { + if (this.getObservablePending(hashKey)) { + throw new Error('Post request is already pending'); + } + return ApiService.observables.push({key: hashKey, value: post}); + } + + protected addSubscribtion(hashKey: string, subscription: ApiSubscriptionModel): number { + return ApiService.subscriptions.push({key: hashKey, value: subscription}); + } + + protected resolveSubscribtionsOnSuccess(hashKey: string, response: ApiResponseModel): number { + let resolved = 0; + ApiService.subscriptions.forEach((subscription: KeyValue) => { + if (subscription.key === hashKey) { + subscription.value.onSuccess(response); + resolved++; + } + }); + return resolved; + } + + protected resolveSubscribtionsOnError(hashKey: string, error: HttpErrorResponse): number { + let resolved = 0; + ApiService.subscriptions.forEach((subscription: KeyValue) => { + if (subscription.key === hashKey) { + if (subscription.value.onError) { + subscription.value.onError(error); + resolved++; + } + } + }); + return resolved; + } + + protected httpRequest( + params: { + url: string, + type?: string, + body?: any, + options?: any + }, + onSuccess: (response: any) => void, + onError?: (error: HttpErrorResponse) => void): boolean { + let ok = true; + + if (!params.options) { + params.options = {}; + } + + params.options.withCredentials = true; + const hsh = this.useCache ? hash(params, {algorithm: 'md5'}) : hash(Math.random(), {algorithm: 'md5'}); + let req: Observable = this.getObservablePending(hsh); + + if (!req) { + + switch (params.type) { + case 'POST': + req = this.http.post(params.url, params.body, params.options); + break; + case 'GET': + req = this.http.get(params.url, params.options); + break; + default: + throw new Error('Invalid request type should be "POST" or "GET", ' + params.type + ' given'); + } + + let resolved = 0; + + req.subscribe( + (response: ApiResponseModel) => { + resolved = this.resolveSubscribtionsOnSuccess(hsh, response); + if (!resolved) { + console.warn('Unhandled HTTP response', {params, response}); + } + }, + (error: HttpErrorResponse) => { + resolved = this.resolveSubscribtionsOnError(hsh, error); + if (!resolved) { + console.error('Unhandled HTTP error', {params, error}); + } + } + ); + + if (!this.addSubscribtion(hsh, {onSuccess, onError})) { + console.warn('Unable to subscribe for an HTTP request', params); + ok = false; + } + + if (!this.addObservable(hsh, req)) { + console.warn('Unable to observe an HTTP request', params); + ok = false; + } + } else { + (response: ApiResponseModel) => { + let resolved = this.resolveSubscribtionsOnSuccess(hsh, response); + if (!resolved) { + console.warn('Unhandled HTTP response', {params, response}); + } + } + } + + return ok; + } + + protected getAccessToken( + onSuccess?: (response: ApiAccessTokenResponseModel) => void, + onError?: (error: HttpErrorResponse) => void + ): boolean { + const params = { + grant_type: 'refresh_token', + client_id: 'scrmfe', + client_secret: 'scrmfe', + scope: '' + }; + return this.httpRequest( + {type: 'POST', url: 'index.php?module=Users&controller=Oauth&action=AccessToken', body: params}, + (response: ApiAccessTokenResponseModel) => { + ApiService.accessTokenResponse = response; + if (onSuccess) { + onSuccess(response); + } + }, + (error: HttpErrorResponse) => { + if (onError) { + onError(error); + } else { + console.error('Api auth error', error); + } + } + ); + } + + protected httpRequestAuthorized( + params: { + url: string, + type?: string, + body?: any, + options?: any + }, + onSuccess: (response: ApiResponseModel) => void, + onError?: (error: HttpErrorResponse) => void, + onUnauthorized?: (error: HttpErrorResponse) => void + ): boolean { + + if (!params.options) { + params.options = {}; + } + + params.options.headers = {Authorization: ApiService.accessTokenResponse.tokenType + ' ' + ApiService.accessTokenResponse.tokenType}; + params.options.withCredentials = true; + + return this.httpRequest( + params, + (response: ApiResponseModel) => { + onSuccess(response); + }, + (error: HttpErrorResponse) => { + if (error.status === 401) { + // API Request is unauthorized, trying to get a new access_token... + this.getAccessToken(() => { + if (!onUnauthorized) { + this.message.addDangerMessage('API access_token renewed, repeat the request'); + } else { + onUnauthorized(error); + } + }); + } else { + if (!onError) { + this.message.addDangerMessage('API response error occured.'); + } else { + onError(error); + } + } + } + ); + } + + protected request( + params: { + url: string, + type?: string, + body?: any, + options?: any + }, + onSuccess: (response: ApiResponseModel) => void, + onError?: (error: HttpErrorResponse) => void, + onUnauthorized?: (error: HttpErrorResponse) => void + ): boolean { + if (!ApiService.accessTokenResponse) { + this.message.log('API is trying to call an http POST request, but first it needs an access token..'); + return this.getAccessToken((results) => { + + this.message.log('API given an access token results', results); + + if (!this.httpRequestAuthorized(params, onSuccess, onError, onUnauthorized)) { + this.message.error('Authorization error', params); + } + }); + } else { + return this.httpRequestAuthorized(params, onSuccess, onError, onUnauthorized); + } + } + + protected post( + url: string, body: any, + onSuccess: (response: ApiResponseModel) => void, + onError?: (error: HttpErrorResponse) => void + ): boolean { + return this.request({type: 'POST', url, body}, onSuccess, onError); + } + + protected get( + url: string, + onSuccess: (response: ApiResponseModel) => void, + onError?: (error: HttpErrorResponse) => void + ): boolean { + return this.request({type: 'GET', url}, onSuccess, onError); + } + + getSvgFilenameMap(callback: (response: SvgFilenameMapModel[]) => void): boolean { + return false; + + // return this.get(this.config.apiBaseUrl + 'module=Template&controller=Index&action=GetSvgIcon', (response: ApiResponseModel) => { + // if (response.error) { throw new Error('Api response error: ' + response.error.message); } + // callback(response.list); + // }); + } + + getListViewData( + listViewData: ListViewData, + callback: (listViewData: ListViewDataModel) => void, + orderBy: string, + desc: string + ) { + // this.useCache = false; + // const ret = this.get(this.config.apiBaseUrl + 'module=PluralNames&controller=Index&action=List', (apiResponse: ApiResponseModel) => { + // let modulePlural = ''; + // for (const k in apiResponse) { + // if (apiResponse[k].singular === listViewData.module) { + // modulePlural = apiResponse[k].plural; + // break; + // } + // if (apiResponse[k].plural === listViewData.module) { + // modulePlural = apiResponse[k].plural; + // break; + // } + // } + // if (!modulePlural) { + // throw new Error('No plural for ' + listViewData.module); + // } + + // return this.get( + // this.config.apiBaseUrl + 'moule=' + modulePlural + '&controller=Index&action=List&orderBy=' + orderBy + '&desc=' + desc, + // (response: ApiResponseModel) => { + + // if (response.error) { + // throw new Error('Api ressponse error: ' + response.error.message); + // } + + // this.useCache = true; + + // callback({ + // module: response.data.module, + // columns: response.data.columns, + // rows: response.list, + // page: response.data.page, + // maxpage: response.data.maxpage, + // }); + // }); + // }); + // return ret; + + return false; + } + +} diff --git a/core/app/ui/services/auth/auth-guard.service.ts b/core/app/ui/services/auth/auth-guard.service.ts new file mode 100644 index 000000000..94ff64f6d --- /dev/null +++ b/core/app/ui/services/auth/auth-guard.service.ts @@ -0,0 +1,17 @@ +import {Injectable} from '@angular/core'; +import {ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot} from '@angular/router'; +import {MessageService} from '../message/message.service'; + +@Injectable({ + providedIn: 'root' +}) +export class AuthGuard implements CanActivate { + + constructor(protected message: MessageService, protected router: Router) { + } + + canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean { + return true; + } + +} diff --git a/core/app/ui/services/auth/auth.service.ts b/core/app/ui/services/auth/auth.service.ts new file mode 100644 index 000000000..973d4d519 --- /dev/null +++ b/core/app/ui/services/auth/auth.service.ts @@ -0,0 +1,99 @@ +import {Injectable} from '@angular/core'; +import {HttpClient, HttpErrorResponse, HttpParams, HttpHeaders} from '@angular/common/http'; +import {Router} from '@angular/router'; +import {LoginUiComponent} from '../../components/login/login.component'; +import {LogoutUiComponent} from '../../components/logout/logout.component'; +import {LoginResponseModel} from './login-response-model'; +import {MessageService} from '../message/message.service'; +import {ApiService} from '../api/api.service'; + +@Injectable({ + providedIn: 'root' +}) +export class AuthService { + protected loginResponse: LoginResponseModel = null; + + protected user = null; + + constructor( + protected api: ApiService, + protected router: Router, + protected message: MessageService, + protected http: HttpClient + ) { + } + + isLoggedIn(): boolean { + return this.user != null && !this.user.expired; + } + + doLogin( + caller: LoginUiComponent, + username: string, + password: string, + onSuccess: (caller: LoginUiComponent, loginResponse: LoginResponseModel) => void, + onError: (caller: LoginUiComponent, error: HttpErrorResponse) => void + ) { + const loginUrl = 'index.php?module=users&controller=oauth&action=login'; + + const body = new HttpParams() + .set('username', username) + .set('password', password) + .set('grant_type', 'password') + .set('client_id', 'scrmfe') + .set('client_secret', 'scrmfe'); + + return this.http.post(loginUrl, + body.toString(), + { + headers: new HttpHeaders() + .set('Content-Type', 'application/x-www-form-urlencoded') + } + ).subscribe((response: LoginResponseModel) => { + this.api.reset(response); + this.loginResponse = response; + onSuccess(caller, this.loginResponse); + }, (error: HttpErrorResponse) => { + onError(caller, error); + }); + } + + getLoginResponse(): LoginResponseModel | null { + if (!this.loginResponse) { + return null; + } + return this.loginResponse; + } + + doLogout( + caller: LogoutUiComponent, + onSuccess: (caller: LogoutUiComponent, resp: any) => void, + onError: (caller: LogoutUiComponent, error: HttpErrorResponse) => void + ) { + + const loginResponse = this.getLoginResponse(); + + if (!loginResponse) { + this.router.navigateByUrl('Login'); + return; + } + + const logoutUrl = 'index.php?module=users&controller=oauth&action=logout'; + + const body = new HttpParams() + .set('access_token', loginResponse.access_token) + .set('refresh_token', loginResponse.refresh_token); + + return this.http.post(logoutUrl, + body.toString(), + { + headers: new HttpHeaders() + .set('Content-Type', 'application/x-www-form-urlencoded') + } + ).subscribe((resp) => { + onSuccess(caller, resp); + }, (error: HttpErrorResponse) => { + onError(caller, error); + }); + } +} diff --git a/core/app/ui/services/auth/login-response-model.ts b/core/app/ui/services/auth/login-response-model.ts new file mode 100644 index 000000000..150f0d0e7 --- /dev/null +++ b/core/app/ui/services/auth/login-response-model.ts @@ -0,0 +1,7 @@ +export interface LoginResponseModel { + access_token: string; + expires_in: number; + refresh_token: string; + scope?: string[]; + token_type: string; +} diff --git a/core/app/ui/services/auth/logout-response-model.ts b/core/app/ui/services/auth/logout-response-model.ts new file mode 100644 index 000000000..c9b011aaa --- /dev/null +++ b/core/app/ui/services/auth/logout-response-model.ts @@ -0,0 +1,3 @@ +export interface LogoutResponseModel { + +} diff --git a/core/app/ui/services/auth/user-model.ts b/core/app/ui/services/auth/user-model.ts new file mode 100644 index 000000000..d557418cc --- /dev/null +++ b/core/app/ui/services/auth/user-model.ts @@ -0,0 +1,8 @@ +export interface UserModel { + name: string; + id: string; + userName: string; + salutation?: string; + status: string; + isAdmin: boolean; +} diff --git a/core/app/ui/services/message/message.service.spec.ts b/core/app/ui/services/message/message.service.spec.ts new file mode 100644 index 000000000..e088534ef --- /dev/null +++ b/core/app/ui/services/message/message.service.spec.ts @@ -0,0 +1,12 @@ +import {TestBed} from '@angular/core/testing'; + +import {MessageService} from './message.service'; + +describe('MessageService', () => { + beforeEach(() => TestBed.configureTestingModule({})); + + it('should be created', () => { + const service: MessageService = TestBed.get(MessageService); + expect(service).toBeTruthy(); + }); +}); diff --git a/core/app/ui/services/message/message.service.ts b/core/app/ui/services/message/message.service.ts new file mode 100644 index 000000000..be6862ad3 --- /dev/null +++ b/core/app/ui/services/message/message.service.ts @@ -0,0 +1,112 @@ +import {Injectable} from '@angular/core'; +import {MessageType} from '../../components/message/message-type'; +import {MessageTypes} from '../../components/message/message-types.enum'; +import {MessageUiComponent} from '../../components/message/message.component'; + +@Injectable({ + providedIn: 'root' +}) +export class MessageService { + messages: Array = []; + messageComponent?: MessageUiComponent; + + constructor() { + } + + subscribe(messageComponent: MessageUiComponent) { + this.messageComponent = messageComponent; + this.messageComponent.update(this.messages); + } + + removeMessages() { + this.messages = []; + if (this.messageComponent) { + this.messageComponent.update(this.messages); + } + } + + contains(message: MessageType, remove: boolean = false): boolean { + let found = false; + for (let i = 0; i < this.messages.length; i++) { + if (message.text === this.messages[i].text) { + found = true; + if (remove) { + this.messages.splice(i, 1); + } + break; + } + } + return found; + } + + addMessage(message: MessageType): number { + // push message only if it does not contains already... + let ret = -1; + if (!this.contains(message)) { + ret = this.messages.push(message); + if (this.messageComponent) { + this.messageComponent.update(this.messages); + } + } + return ret; + } + + addPrimaryMessage(text: string): number { + return this.addMessage({ + type: MessageTypes.primary, + text + }); + } + + addSecondaryMessage(text: string): number { + return this.addMessage({ + type: MessageTypes.secondary, + text + }); + } + + addSuccessMessage(text: string): number { + return this.addMessage({ + type: MessageTypes.success, + text + }); + } + + addDangerMessage(text: string): number { + return this.addMessage({ + type: MessageTypes.danger, + text + }); + } + + addWarningMessage(text: string): number { + return this.addMessage({ + type: MessageTypes.warning, + text + }); + } + + addInfoMessage(text: string): number { + return this.addMessage({ + type: MessageTypes.info, + text + }); + } + + addDarkMessage(text: string): number { + return this.addMessage({ + type: MessageTypes.dark, + text + }); + } + + // --- LOG --- + + log(...args: any[]) { + console.log.apply(console, arguments); + } + + error(...args: any[]) { + console.error.apply(console, arguments); + } +} diff --git a/core/app/views/create/create.php b/core/app/views/create/create.php new file mode 100644 index 000000000..f40decdec --- /dev/null +++ b/core/app/views/create/create.php @@ -0,0 +1,3 @@ +fileHelper = $file; + + try { + $this->configParameters = $config->loadFiles($config_path); + } catch (\Exception $e) { + trigger_error('Config failed to load files: ' . $e); + } + + $this->enabledModules = $this->configParameters->get('modules.enabled'); + } + + public function getAllModules(): void + { + $modules = (new ModuleManager($this->configParameters, $this->fileHelper))->getAllModules(); + + $this->enabledModules = $modules; + } + + /** + * @return array + */ + public function getAllCommands(): array + { + $commandClasses = []; + + $filePaths = []; + + if (empty($this->enabledModules)) { + $this->getAllModules(); + } + + if (!empty($this->enabledModules)) { + foreach ($this->enabledModules as $module) { + $filePaths[] = APP_PATH . '/' . $module . '/Cli'; + } + } + + $files = $this->fileHelper->findFiles($filePaths, '/Command.php$/'); + + if (!empty($files)) { + foreach ($files as $file) { + $parts = explode('/', $file); + + $key = array_search('modules', $parts, true); + + $parts = array_splice($parts, ($key + 1), count($parts)); + + $filename = end($parts); + $classname = rtrim($filename, '.php'); + + $keys = array_keys($parts); + $key = end($keys); + + $parts[$key] = $classname; + + $commandClass = 'SuiteCRM\\Core\\Modules\\' . implode('\\', $parts); + + $commandClasses[] = new $commandClass($this->configParameters); + } + } + + return $commandClasses; + } + +} diff --git a/core/base/Cli/SuiteCommand.php b/core/base/Cli/SuiteCommand.php new file mode 100644 index 000000000..37c210f9e --- /dev/null +++ b/core/base/Cli/SuiteCommand.php @@ -0,0 +1,19 @@ +locate($path); + } + + $loaderResolver = new LoaderResolver([new YamlLoader($fileLocator)]); + + $delegatingLoader = new DelegatingLoader($loaderResolver); + + // All config parameters + $allParameters = []; + + if ($configPaths !== false) { + foreach ($configPaths as $path) { + // Load the parameters from the path resource + $parameters = $delegatingLoader->load($path); + + // Merge parameters together + if (!empty($parameters)) { + $allParameters = array_merge($allParameters, $parameters); + } + } + } + + return new ParameterCollection($allParameters); + } +} + diff --git a/core/base/Config/ParameterCollection.php b/core/base/Config/ParameterCollection.php new file mode 100644 index 000000000..ae70c0e03 --- /dev/null +++ b/core/base/Config/ParameterCollection.php @@ -0,0 +1,13 @@ +load($data); + } + + /** + * Recursive function to collect the collection data + * + * @param array $data The collection data + * @param string $parent_key The parent keys attached to the child array + * @return bool + */ + public function load($data, $parent_key = ''): bool + { + if (empty($data)) { + return false; + } + + $parentKey = ($parent_key !== '') ? $parent_key . '.' : ''; + + foreach ($data as $key => $val) { + if (is_array($val)) { + $this->load($data[$key], $parentKey . $key); + } + + $this->data[$parentKey . $key] = $val; + } + + return true; + } + + /** + * Get all config variable + * + * @return array + */ + public function getAll(): array + { + return $this->data; + } + + /** + * Get collection data + * + * @param string $key + * @return bool|mixed + */ + public function get($key) + { + return ($this->has($key)) ? $this->data[$key] : false; + } + + /** + * Set collection data + * + * @param string $key Name of parameter to set + * @param mixed $value Value to set + */ + public function set($key, $value): void + { + $this->data[$key] = $value; + } + + /** + * Find out if parameter exists + * + * @param string $key Name to find out + * @return bool + */ + public function has($key): bool + { + return isset($this->data[$key]); + } + + /** + * Count collection entry for key + * + * @param string|null $key The config key you want to count + * @return int + */ + public function count($key = null): int + { + return ($key === null) ? count($this->data) : count($this->data[$key]); + } + + /** + * Check if the collection key is empty + * + * @param string $key + * @return bool true if empty - false - if not + */ + public function isEmpty($key): bool + { + $has = $this->has($key); + + if ($has) { + $count = $this->count($key); + + if ($count > 0) { + return false; + } + } + + return true; + } +} diff --git a/core/base/Helper/Data/CollectionInterface.php b/core/base/Helper/Data/CollectionInterface.php new file mode 100644 index 000000000..f9740f35d --- /dev/null +++ b/core/base/Helper/Data/CollectionInterface.php @@ -0,0 +1,50 @@ +isDot()) { + continue; + } + + if ($fileInfo->isDir()) { + $directories[] = $fileInfo->getFilename(); + } + } + } + + return $directories; + } + + /** + * Make directory + * + * @param string $path + * @param int $permissions octal + * @return bool + */ + public function makeDir($path, $permissions = 0777): bool + { + return is_dir($path) || mkdir($path, $permissions, true) || is_dir($path); + } + + /** + * Delete a directory and all files + * + * @param string $dir The directory path you want to delete + * @param array $files_to_leave + * @return bool True - successfully deleted False - issue with deletion + */ + public function deleteDirectory(string $dir, array $files_to_leave = []): bool + { + $di = new RecursiveDirectoryIterator($dir, FilesystemIterator::SKIP_DOTS); + + $ri = new RecursiveIteratorIterator($di, RecursiveIteratorIterator::CHILD_FIRST); + + if (empty($files_to_leave)) { + foreach ($ri as $file) { + $file->isDir() ? rmdir($file) : unlink($file); + } + } else { + foreach ($ri as $file) { + if (strpos($file->getPathName(), $files_to_leave[0]) === false) { + $file->isDir() ? rmdir($file) : unlink($file); + } + } + } + + return (!$this->isDirectoryEmpty($dir)) ?: rmdir($dir); + } + + /** + * Check to see if directory is empty + * + * @param string $dir + * @return bool + */ + public function isDirectoryEmpty($dir): bool + { + if (!is_readable($dir)) { + return null; + } + + return (count(scandir($dir)) == 2); + } + + /** + * File files + * + * @param string|array $directories The directory to look in + * @param string $search The pattern to find the files + * @return array + */ + public function findFiles($directories, $search): array + { + $foundFiles = []; + + // Convert to array if string given + if (is_string($directories)) { + $directories = [$directories]; + } + + foreach ($directories as $directory) { + $directory = realpath($directory); + + $objDirectory = new RecursiveDirectoryIterator($directory, RecursiveDirectoryIterator::SKIP_DOTS); + + $iterator = new RecursiveIteratorIterator($objDirectory); + + $files = new \RegexIterator($iterator, $search, \RecursiveRegexIterator::GET_MATCH); + + if ($files !== null) { + foreach ($files as $key => $value) { + $foundFiles[] = $key; + } + } + } + + return $foundFiles; + } + + /** + * Copy files recursively + * @param $src + * @param $dst + */ + public function recurseCopy($src, $dst): void + { + $dir = \opendir($src); + + if (!is_dir($dst)) { + try { + if (!mkdir($dst) && !is_dir($dst)) { + throw new \RuntimeException(sprintf('Directory "%s" was not created', $dst)); + } + } catch (\Exception $e) { + throw new \RuntimeException(sprintf('Directory "%s" was not created', $dst)); + } + } + + chmod($dst, 0777); + + while (false !== ($file = \readdir($dir))) { + if (($file !== '.') && ($file !== '..')) { + if (\is_dir($src . '/' . $file)) { + $this->recurseCopy($src . '/' . $file, $dst . '/' . $file); + } else { + \copy($src . '/' . $file, $dst . '/' . $file); + } + } + } + + \closedir($dir); + } +} diff --git a/core/base/Helper/File/FileMapperInterface.php b/core/base/Helper/File/FileMapperInterface.php new file mode 100644 index 000000000..144badf2d --- /dev/null +++ b/core/base/Helper/File/FileMapperInterface.php @@ -0,0 +1,18 @@ +modules = $modules; + $this->config = $config; + $this->route = $route; + } + + /** + * Run the Application + * + * @return mixed + */ + public function run() + { + return $this; + } + + /** + * Get all routes from enabled modules + * + * @return array + */ + public function getAllRoutes(): ?array + { + $allRoutes = []; + + foreach ($this->modules as $module) { + $allRoutes = array_merge($allRoutes, $module); + } + + return $allRoutes; + } + + /** + * Get the route of the instance call + * + * @return mixed + * @throws \Exception + */ + public function getRoute() + { + if ($this->route === null) { + throw new \RuntimeException('Route was not configured'); + } + + return $this->route; + } + + /** + * Get all services + * + * @return array + */ + public function getAllServices(): array + { + $allServices = []; + + foreach ($this->modules as $module) { + $allServices = array_merge($allServices, $module); + } + + return $allServices; + } + +} diff --git a/core/base/Module/Controller.php b/core/base/Module/Controller.php new file mode 100644 index 000000000..21bc961cf --- /dev/null +++ b/core/base/Module/Controller.php @@ -0,0 +1,294 @@ +config = $config; + $this->requestObj = $request; + $this->responseObj = $response; + $this->view = $view; + $this->services = $services; + + if ($this->config->has('storage.mysql.driver')) { + $connectionParams = $this->config->get('storage.mysql'); + $namespaces = $this->config->get('entity.namespaces'); + + $realNamespaces = []; + + foreach ($namespaces as $path => $namespace) { + $realPath = realpath($path); + if ($realPath !== false) { + $realNamespaces[$realPath] = $namespace; + } + } + + $driver = new SimplifiedYamlDriver($realNamespaces); + + + $realNamespaces = []; + + foreach ($namespaces as $path => $namespace) { + $realPath = realpath($path); + if ($realPath !== false) { + $realNamespaces[$realPath] = $namespace; + } + } + + $driver = new SimplifiedYamlDriver($realNamespaces); + + $isDevMode = false; + + if ($this->config->has('server.environment') && $this->config->get('server.environment') === 'develop') { + $isDevMode = true; + } + + $config = Setup::createYAMLMetadataConfiguration( + (array)$namespaces, + $isDevMode + ); + + $cache = new ArrayCache(); + + $config->setMetadataCacheImpl($cache); + $config->setQueryCacheImpl($cache); + $config->setMetadataDriverImpl($driver); + + // Table Prefix + $evm = new EventManager(); + $tablePrefix = new TablePrefix('suite8_'); + $evm->addEventListener(Events::loadClassMetadata, $tablePrefix); + + try { + $entityManager = EntityManager::create($connectionParams, $config, $evm); + } catch (ORMException $e) { + trigger_error('Failed to get create entity manager instance: ' . $e); + } + + //-- This I had to add to support the Mysql enum type. + try { + $platform = $entityManager->getConnection()->getDatabasePlatform(); + } catch (DBALException $e) { + trigger_error('Failed to get DB platform: ' . $e); + } + + try { + $platform->registerDoctrineTypeMapping('enum', 'string'); + } catch (DBALException $e) { + trigger_error('Failed to get register doctrine type mapping: ' . $e); + } + + $this->em = $entityManager; + } + } + + /** + * Get a storage class + * + * @param $namespace + * @return object + */ + public function getStorage($namespace) + { + [$module, $entityName] = explode('.', $namespace); + + return $this->em->getRepository( + 'SuiteCRM\Core\Modules\\' . ucfirst($module) . '\Entity\\' . ucfirst($entityName) + ); + } + + /** + * Get a service class + * + * @param $serviceName + * @return object + * @throws Exception + */ + public function getService($serviceName) + { + if (!$this->services->has($serviceName)) { + throw new \RuntimeException('No Service Found: ' . $serviceName); + } + + return $this->services->get($serviceName); + } + + /** + * Quick function to allow for $this->render + * + * @param $view + * @param array $params + * @param string $template + * @return string + */ + public function render($view, $params = [], $template = 'default.html.php'): string + { + return $this->view->render($view, $params, $template); + } + + /** + * Redirect to URL + * + * @param mixed $url Array or string + * @param mixed $params Params too be sent + * @param int $statusCode + * @todo Get Base URL, Concat the Base URL with Route (Controller, Action), Test Array and String + * + */ + public function redirect($url, $params = [], $statusCode = 303): void + { + $this->session->set('redirectPost', $params); + + if (is_array($url)) { + $url = implode('/', $url); + } + + $urlHelper = new Url(); + + header('Location: ' . $urlHelper->baseUrl() . $url, true, $statusCode); + die(); + } + + /** + * Redirect to URL + * + * @param mixed $url URL to redirect to + * @param int $statusCode Forces the HTTP response code to the specified value. Note that this parameter only has an effect if the header is not empty. + */ + public function redirectToUrl($url, $statusCode = 303): void + { + header('Location: ' . $url, true, $statusCode); + die(); + } + + /** + * Create a flash message. + * + * @param string $message Flash Message + * @param string $type Type of Message + * @return void + * @todo create one time session var for flash_msg, + * + */ + public function flashMsg($message, $type = 'default'): void + { + $this->session->set('flashMsg', ['message' => $message, 'type' => $type], 1); + } + + /** + * @param $template + * @param $params + */ + public function renderTemplate($template, $params): void + { + $response = [ + 'template' => ' +
+ +
+ ', + 'scripts' => [ + 'https://code.jquery.com/jquery-3.4.1.min.js' + ] + ]; + + header('Content-Type: application/json'); + + echo json_encode($response); + } +} diff --git a/core/base/Module/Manager.php b/core/base/Module/Manager.php new file mode 100644 index 000000000..2ab36b565 --- /dev/null +++ b/core/base/Module/Manager.php @@ -0,0 +1,134 @@ +config = $config; + $this->fileHelper = $file_helper; + } + + /** + * Get Module Paths + * + * @return array + */ + public function getModulePaths(): array + { + // Get config module paths if set + + if (!$this->config->isEmpty('modules.paths')) { + $modulePaths = []; + $configModulePaths = $this->config->get('modules.paths'); + + foreach ($configModulePaths as $modulePath) { + $modulePaths[] = realpath(__DIR__ . $modulePath); + } + + return $modulePaths; + } + + // Return default module paths + return [ + realpath(BASE_PATH . '/core/modules') + ]; + } + + /** + * Get an array of all modules + * + * @return array + */ + public function getAllModules(): array + { + $modulePaths = $this->getModulePaths(); + + return (new ModuleMapper($modulePaths, $this->fileHelper, $this->config))->getAllModuleFolders(); + } + + /** + * Get a list of the enabled modules + * + * @return array + */ + public function listEnabled(): array + { + $modulePaths = $this->getModulePaths(); + $moduleMapper = new ModuleMapper($modulePaths, $this->fileHelper, $this->config); + $modules = []; + + if ($this->config->has('modules.enabled')) { + $foundModules = []; + + $enabledModules = $this->config->get('modules.enabled'); + $modules = $moduleMapper->checkModulesExist($enabledModules); + + return $moduleMapper->getModuleClassesFromFileName($modules); + } + + $moduleNames = $this->getAllModules(); + $modules = $moduleMapper->checkModulesExist($moduleNames); + + return $moduleMapper->getModuleClassesFromFileName($modules); + } + + /** + * Get Module Services + * + * @return array + */ + public function getModuleServices(): ?array + { + $modules = $this->getEnabled(); + + $moduleServices = []; + + foreach ($modules as $module) { + $moduleServices[] = $module->getServices; + } + } + + /** + * Get Module Command + * + * @return array + */ + public function getModuleCommands(): ?array + { + $modules = $this->getEnabled(); + + $moduleCommands = []; + + foreach ($modules as $module) { + //$moduleCommands + } + } +} diff --git a/core/base/Module/ModuleCollection.php b/core/base/Module/ModuleCollection.php new file mode 100644 index 000000000..efcd32c4c --- /dev/null +++ b/core/base/Module/ModuleCollection.php @@ -0,0 +1,22 @@ +filePaths = $file_paths; + $this->fileHelper = $file; + $this->moduleConfigParameters = $module_config_params; + $this->enabledModules = $this->moduleConfigParameters->get('modules.enabled'); + } + + + /** + * Get All Module Folders + * + * @return array + */ + public function getAllModuleFolders(): array + { + return $this->fileHelper->findDirectories($this->filePaths); + } + + + /** + * Check modules exist out of an array input modules + * + * @param array $modules array of module names to check + * @return array List if found modules + */ + public function checkModulesExist($modules): array + { + $foundModules = []; + + if (!empty($modules)) { + foreach ($modules as $module) { + foreach ($this->filePaths as $path) { + if (file_exists($path . '/' . $module . '/' . $module . '.php')) { + $foundModules[] = $path . '/' . $module . '/' . $module . '.php'; + } + } + } + } + + return $foundModules; + } + + /** + * Get all module classes from file name + * + * @param $files + * @return array|bool + */ + public function getModuleClassesFromFileName($files) + { + if (empty($files)) { + return false; + } + + $moduleClasses = []; + + foreach ($files as $file) { + $file = str_replace('suitecrm/', '', $file); + $parts = explode('/', $file); + $parts = array_splice($parts, 4, count($parts)); + + $filename = end($parts); + $classname = rtrim($filename, '.php'); + + $keys = array_keys($parts); + $key = end($keys); + + $parts[$key] = $classname; + + $parts = array_map('ucfirst', $parts); + + $commandClass = 'SuiteCRM\\' . implode('\\', $parts); + + $moduleClasses[] = new $commandClass(); + } + + return $moduleClasses; + } + +} diff --git a/core/base/Module/Service/Manager.php b/core/base/Module/Service/Manager.php new file mode 100644 index 000000000..773a9f2f8 --- /dev/null +++ b/core/base/Module/Service/Manager.php @@ -0,0 +1,34 @@ +listEnabled() as $module) { + $file = new FileLocator(); + + $service = new $module(); + } + + return (new ServiceCollection())->load(); + } + + +} diff --git a/core/base/Module/Service/ServiceCollection.php b/core/base/Module/Service/ServiceCollection.php new file mode 100644 index 000000000..43360832b --- /dev/null +++ b/core/base/Module/Service/ServiceCollection.php @@ -0,0 +1,22 @@ +fileHelper = $file; + $this->moduleManager = $moduleManager; + $this->config = $config; + } + + /** + * Get all services enabled in the system + * + * @return ServiceCollection + */ + public function getAllServices(): ServiceCollection + { + $serviceClasses = []; + + $filePaths = []; + + $enabledModules = $this->moduleManager->getAllModules(); + + // Get Application Service + if (!empty($enabledModules)) { + foreach ($enabledModules as $module) { + $path = APP_PATH . 'Modules/' . $module . '/Service'; + if (file_exists($path)) { + $filePaths[] = $path; + } + } + } + + $files = $this->fileHelper->findFiles($filePaths, '/Service.php$/'); + + if (!empty($files)) { + foreach ($files as $file) { + $parts = explode('/', $file); + + $key = array_search('Modules', $parts, true); + + $parts = array_splice($parts, $key, count($parts)); + + $filename = end($parts); + $classname = rtrim($filename, '.php'); + + $keys = array_keys($parts); + $key = end($keys); + + $parts[$key] = $classname; + + $serviceClass = 'SuiteCRM\\App\\' . implode('\\', $parts); + + $service = new $serviceClass(); + $serviceName = $service->getName(); + + $serviceClasses[$serviceName] = $service->createService(); + } + } + + // Load in configuration services if they're available + if ($this->config->has('services')) { + foreach ($this->config->get('services') as $serviceName => $serviceFactory) { + $serviceFactory = new $serviceFactory(); + $service = $serviceFactory->createService(); + $serviceClasses[$serviceName] = $service; + } + } + + return new ServiceCollection($serviceClasses); + } +} diff --git a/core/base/Module/Storage/DataCollectionManager.php b/core/base/Module/Storage/DataCollectionManager.php new file mode 100644 index 000000000..eaea1c2d4 --- /dev/null +++ b/core/base/Module/Storage/DataCollectionManager.php @@ -0,0 +1,58 @@ +dataProviders = $dataProviders; + } + + /** + * Get the Collection Object + * + * @param string $resourceClass + * @param string $operationName + * @param array $context + * @return array + */ + public function getCollection(string $resourceClass, string $operationName = null, array $context = []): array + { + foreach ($this->dataProviders as $dataProvider) { + try { + if ($dataProvider instanceof RestrictedDataProviderInterface + && !$dataProvider->supports($resourceClass, $operationName, $context)) { + continue; + } + + return $dataProvider->getCollection($resourceClass, $operationName, $context); + } catch (ResourceClassNotSupportedException $e) { + @trigger_error( + sprintf( + 'Throwing a "%s" in a data provider is deprecated in favor of implementing "%s"', + ResourceClassNotSupportedException::class, + RestrictedDataProviderInterface::class + ), + E_USER_DEPRECATED + ); + } + } + + return []; + } +} diff --git a/core/base/Module/Storage/DoctrineCommands.php b/core/base/Module/Storage/DoctrineCommands.php new file mode 100644 index 000000000..0041dd713 --- /dev/null +++ b/core/base/Module/Storage/DoctrineCommands.php @@ -0,0 +1,37 @@ +getApplication()->getKernel()->getContainer()->get('doctrine'); + + $em = $doctrine->getEntityManager(); + $db = $em->getConnection(); + + $helperSet = $this->getHelperSet(); + $helperSet->set(new ConnectionHelper($db), 'db'); + $helperSet->set(new EntityManagerHelper($em), 'em'); + + parent::execute($input, $output); + } + +} diff --git a/core/base/Module/Storage/Manager.php b/core/base/Module/Storage/Manager.php new file mode 100644 index 000000000..435e1d816 --- /dev/null +++ b/core/base/Module/Storage/Manager.php @@ -0,0 +1,25 @@ +addEventListener(\Doctrine\ORM\Events::loadClassMetadata, $tablePrefix); + + $em = \Doctrine\ORM\EntityManager::create($connectionOptions, $config, $evm); + + parent::__construct(); + } +} \ No newline at end of file diff --git a/core/base/Module/Storage/TablePrefix.php b/core/base/Module/Storage/TablePrefix.php new file mode 100644 index 000000000..864b5d2ff --- /dev/null +++ b/core/base/Module/Storage/TablePrefix.php @@ -0,0 +1,49 @@ +prefix = (string)$prefix; + } + + /** + * @param LoadClassMetadataEventArgs $eventArgs + */ + public function loadClassMetadata(LoadClassMetadataEventArgs $eventArgs): void + { + $classMetadata = $eventArgs->getClassMetadata(); + + if (!$classMetadata->isInheritanceTypeSingleTable() || $classMetadata->getName( + ) === $classMetadata->rootEntityName) { + $classMetadata->setPrimaryTable( + [ + 'name' => $this->prefix . $classMetadata->getTableName() + ] + ); + } + + foreach ($classMetadata->getAssociationMappings() as $fieldName => $mapping) { + if ($mapping['type'] === ClassMetadataInfo::MANY_TO_MANY && $mapping['isOwningSide']) { + $mappedTableName = $mapping['joinTable']['name']; + $classMetadata->associationMappings[$fieldName]['joinTable']['name'] = $this->prefix . $mappedTableName; + } + } + } + +} diff --git a/core/base/Module/View/Handler.php b/core/base/Module/View/Handler.php new file mode 100644 index 000000000..256cead8f --- /dev/null +++ b/core/base/Module/View/Handler.php @@ -0,0 +1,39 @@ +requestObj = $request; + $this->config = $config; + } + + /** + * @return object + * @throws \Exception + */ + public function load() + { + // Check the correct controller and action is going to load based on the URI + + $module = ($this->requestObj->query->has('module')) ? $this->requestObj->query->get('module') : ''; + $controller = ($this->requestObj->query->has('controller')) ? $this->requestObj->query->get('controller') : ''; + $action = ($this->requestObj->query->has('action')) ? $this->requestObj->query->get('action') : ''; + + // Run Installer if database config hasn't been configured + + if (empty($module)) { + // Check mandatory parameters are set + + if (!$this->config->has('app.default_route.module')) { + throw new \RuntimeException('Default module has not been configured.'); + } + + $module = $this->config->get('app.default_route.module'); + } + + if (empty($controller)) { + // Check mandatory parameters are set + if (!$this->config->has('app.default_route.controller')) { + throw new \RuntimeException('Default controller has not been configured.'); + } + + $controller = $this->config->get('app.default_route.controller'); + } + + if (empty($action)) { + // Check mandatory parameters are set + if (!$this->config->has('app.default_route.action')) { + throw new \RuntimeException('Default action has not been configured.'); + } + + $action = $this->config->get('app.default_route.action'); + } + + $format = 'SuiteCRM\Core\Modules\%s\Controller\%s'; + + $controller = sprintf($format, ucfirst($module), ucfirst($controller)); + + // run the controller action + return (object)[ + 'module' => $module, + 'controller' => $controller, + 'action' => 'action' . ucfirst($action) + ]; + } +} diff --git a/core/base/Route/ModRewriteRouter.php b/core/base/Route/ModRewriteRouter.php new file mode 100644 index 000000000..4f15d7cd4 --- /dev/null +++ b/core/base/Route/ModRewriteRouter.php @@ -0,0 +1,99 @@ +requestObj = $request; + $this->config = $config; + } + + /** + * @return object + * @throws \Exception + */ + public function load() + { + // Check the correct controller and action is going to load based on the URI + if ($this->requestObj->query->has('query_string')) { + $uri = explode('/', $this->requestObj->query->get('query_string')); + + if (count($uri) === 1) { + array_push($uri, '', ''); + } elseif (count($uri) === 2) { + $uri[] = ''; + } + + [$module, $controller, $action] = $uri; + } + + // Run Installer if database config hasn't been configured + + if (empty($module)) { + // Check mandatory parameters are set + + if (!$this->config->has('app.default_route.module')) { + throw new \RuntimeException('Default module has not been configured.'); + } + + $module = $this->config->get('app.default_route.module'); + } + + if (empty($controller)) { + // Check mandatory parameters are set + if (!$this->config->has('app.default_route.controller')) { + throw new \RuntimeException('Default controller has not been configured.'); + } + + $controller = $this->config->get('app.default_route.controller'); + } + + if (empty($action)) { + // Check mandatory parameters are set + if (!$this->config->has('app.default_route.action')) { + throw new \RuntimeException('Default action has not been configured.'); + } + + $action = $this->config->get('app.default_route.action'); + } + + $format = 'SuiteCRM\Core\Modules\%s\Controller\%s'; + + $controller = sprintf($format, ucfirst($module), ucfirst($controller)); + + // run the controller action + return (object)[ + 'module' => $module, + 'controller' => $controller, + 'action' => 'action' . ucfirst($action) + ]; + } +} diff --git a/core/base/Route/RouterInterface.php b/core/base/Route/RouterInterface.php new file mode 100644 index 000000000..97a1998ae --- /dev/null +++ b/core/base/Route/RouterInterface.php @@ -0,0 +1,15 @@ +config = $config; + + return $this; + } + + /** + * Legacy login + * + * @param $username + * @param $password + * @param $grant_type + * + * @return boolean + * @throws \Exception + */ + public function login($username, $password, $grant_type = 'password'): bool + { + if ($this->runLegacyEntryPoint()) { + $authController = new \AuthenticationController(); + + $PARAMS = []; + + return $authController->login($username, $password, $PARAMS); + } + + throw new \RuntimeException('Running legacy entry point failed'); + } +} diff --git a/core/legacy/AuthenticationService.php b/core/legacy/AuthenticationService.php new file mode 100644 index 000000000..51ed794eb --- /dev/null +++ b/core/legacy/AuthenticationService.php @@ -0,0 +1,38 @@ +config !== null) { + // Set up sugarEntry + if (!defined('sugarEntry')) { + define('sugarEntry', true); + } + + // Set working directory for legacy + chdir(BASE_PATH . '/legacy'); + + // Load in legacy + require_once 'include/MVC/preDispatch.php'; + require_once 'include/entryPoint.php'; + + return true; + } + + return false; + } +} diff --git a/core/modules/Administration/Administration.php b/core/modules/Administration/Administration.php new file mode 100644 index 000000000..987576722 --- /dev/null +++ b/core/modules/Administration/Administration.php @@ -0,0 +1,28 @@ +config = $config; + $this->file = new File(); + } + + protected function configure(): void + { + $this + ->setName('app:rebuild') + ->setDescription('Rebuild the application') + ->setHelp('This command will rebuild the Application and Plugins') + ->addOption( + 'hard', + '', + InputOption::VALUE_NONE, + 'Run "npm install" during rebuild process' + ); + } + + /** + * @param InputInterface $input + * @param OutputInterface $output + * @return bool|int|null + * @throws \Exception + */ + public function execute(InputInterface $input, OutputInterface $output) + { + $filesToLeave = []; + + $optionValue = $input->getOption('hard'); + $hardRebuild = ($optionValue !== false); + + $optionValue = $input->getOption('verbose'); + $verboseOutput = ($optionValue !== false); + + $rebuildPath = BASE_PATH . 'cache/app'; + + $this->file->makeDir($rebuildPath, 0777); + + $rebuildEnginePath = $rebuildPath . '/engine'; + + $this->file->makeDir($rebuildEnginePath, 0777); + + if ($hardRebuild === false) { + $filesToLeave = [$rebuildEnginePath . '/node_modules']; + } + + $appPath = BASE_PATH . 'core/app/'; + + $enginePath = $appPath . 'engine'; + + $themesPath = BASE_PATH . 'core/app/themes'; + + $assetsPath = $rebuildPath . '/engine/src/assets/themes/'; + + $appFilesPath = [ + 'fields' => $appPath . 'fields', + 'ui' => $appPath . 'ui', + 'views' => $appPath . 'views' + ]; + + // Get modules path + $modulesPath = APP_PATH; + + // Field components + $fields = []; + + // UI components + $ui = []; + + // View components + $views = []; + + // Get the ui app-files path + $uiFilesPath = $rebuildEnginePath . '/src/app/app-files'; + + // Delete ui stored files + chmod($rebuildPath, 0777); + + if (!$this->file->deleteDirectory($rebuildEnginePath, $filesToLeave)) { + throw new \RuntimeException('System can\'t delete cached application engine files'); + } + + // Copy all engine files to rebuild path + $this->file->recurseCopy($enginePath, $rebuildEnginePath); + + // Copy all theme files to assets path + $this->file->recurseCopy($themesPath, $assetsPath); + + // Copy all core app files to ui app-files + foreach ($appFilesPath as $dir => $path) { + if (!file_exists($uiFilesPath . '/' . $dir) && !mkdir( + $concurrentDirectory = $uiFilesPath . '/' . $dir, + 0777 + ) && !is_dir($concurrentDirectory)) { + throw new \RuntimeException(sprintf('Directory "%s" was not created', $concurrentDirectory)); + } + + $this->file->recurseCopy($path . '/', $uiFilesPath . '/' . $dir); + } + + // Find all Ng components + $ngComponents = $this->file->findFiles($uiFilesPath . '/', '/(.*).component.ts/'); + + $componentList = ''; + $moduleList = ''; + $componentImportList = ''; + $moduleImportList = ''; + + foreach ($ngComponents as $filepath) { + $moduleTemplate = ''; + $fullComponentName = ''; + + $pos = strrpos($filepath, '/'); + $pathLength = (strlen($filepath) - 1); + + if ($pathLength > $pos) { + $folderPath = substr($filepath, 0, $pos) . '/'; + + $parts = str_replace($uiFilesPath . '/', '', $filepath); + $parts = explode('/', $parts); + + if (count($parts) < 4) { + continue; + } + + $type = current($parts); + + if ($type === 'fields') { + [$type, $componentName, , $viewName, $componentFileName] = $parts; + + $ufType = ucfirst($type); + $ufViewName = ucfirst($viewName); + + // Create component name + $ufComponentName = implode('', array_map('ucfirst', explode('-', $componentName))); + + $fullComponentName = $ufComponentName . $ufViewName . $ufType . 'Component'; + $fullModuleName = $ufComponentName . $ufViewName . $ufType . 'Module'; + + $appManagerPath = '../../../../../app-manager/app-manager.module'; + $componentFileName = str_replace('.ts', '', $componentFileName); + $componentImportList .= 'import { ' . $fullComponentName . " } from '../app-files/fields/" . $componentName . '/templates/' . $viewName . '/' . $componentFileName . "'; \n"; + + $moduleImportList .= 'import { ' . $fullModuleName . " } from '../app-files/fields/" . $componentName . '/templates/' . $viewName . '/' . $componentName . ".module'; \n"; + } elseif ($type === 'ui') { + [$type, $viewName, $componentName, $componentFileName] = $parts; + + $ufType = ucfirst($type); + $ufViewName = ucfirst($viewName); + + // Create component name + $ufComponentName = implode('', array_map('ucfirst', explode('-', $componentName))); + + $fullComponentName = $ufComponentName . $ufType . 'Component'; + $fullModuleName = $ufComponentName . $ufType . 'Module'; + + $appManagerPath = '../../../../app-manager/app-manager.module'; + + $componentFileName = str_replace('.ts', '', $componentFileName); + //$componentImportList .= "import { " . $fullComponentName . " } from '../app-files/ui/components/" . $componentName . "/" . $componentFileName . "'; \n"; + $moduleImportList .= 'import { ' . $fullModuleName . " } from '../app-files/ui/components/" . $componentName . '/' . $componentName . ".module'; \n"; + } elseif ($type === 'views') { + // Placeholder for view components + } else { + // Continue if type doesn't exist + continue; + } + + if (!file_exists($folderPath . $componentName . '.module.ts')) { + $moduleTemplate = << $type, + 'viewName' => $viewName, + 'componentName' => $componentName, + 'componentFileName' => $componentFileName, + 'fullComponentName' => $fullComponentName, + 'fullModuleName' => $fullModuleName, + ]; + + $componentList .= $fullComponentName . ",\n"; + $moduleList .= $fullModuleName . ",\n"; + + file_put_contents($folderPath . $componentName . '.module.ts', $moduleTemplate); + } else { + $componentList .= $fullComponentName . ",\n"; + $moduleList .= $fullModuleName . ",\n"; + } + } + } + + $fullManifest = ''; + + foreach ($fields as $field) { + $manifestTemplate = " + { + componentId: 'scrm-{type}-{view}', + path: 'scrm-{type}-{view}', + loadChildren: '../app-files/fields/{type}/templates/{view}/{type}.module#{module_name}' + }, + "; + + $manifestTemplate = str_replace('{type}', $field['componentName'], $manifestTemplate); + $manifestTemplate = str_replace('{view}', $field['viewName'], $manifestTemplate); + $manifestTemplate = str_replace('{module_name}', $field['fullModuleName'], $manifestTemplate); + $fullManifest .= $manifestTemplate . "\n"; + } + + $manifestModule = ''; + $manifestModule .= " + import { NgModule, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; + import { CommonModule } from '@angular/common'; + import { AppManifest, AppManagerModule } from '../app-manager/app-manager.module'; + import { FormsModule, ReactiveFormsModule } from '@angular/forms'; + \n\n + " . $moduleImportList . ' + '; + + foreach ($ui as $uiComponent) { + $manifestTemplate = " + { + componentId: 'scrm-{component_name}-ui', + path: 'scrm-{component_name}-ui', + loadChildren: '../app-files/ui/components/{component_name}/{component_name}.module#{module_name}' + }, + "; + + $manifestTemplate = str_replace('{component_name}', $uiComponent['componentName'], $manifestTemplate); + $manifestTemplate = str_replace('{ui_type}', $uiComponent['viewName'], $manifestTemplate); + $manifestTemplate = str_replace('{module_name}', $uiComponent['fullModuleName'], $manifestTemplate); + + $fullManifest .= $manifestTemplate; + } + + $manifestModule .= 'const manifest: AppManifest[] = ['; + $manifestModule .= $fullManifest; + $manifestModule .= '];'; + + $manifestModule .= ' + @NgModule({ + declarations: [], + exports: [ + FormsModule, + ReactiveFormsModule + ], + imports: [ + CommonModule, + AppManagerModule.forRoot(manifest), + ' . $moduleList . ' + ] + }) + export class ManifestModule {} + '; + + // Create manafest module + if (file_put_contents($rebuildEnginePath . '/src/app/app-manifest/manifest.module.ts', $manifestModule)) { + $appDir = getcwd(); + + chdir($rebuildEnginePath); + + // If node_modules isn't present of --hard was option - run npm install + if (!file_exists($rebuildEnginePath . '/node_modules')) { + echo "Updating npm...\n\n"; + $npmCmd = 'npm update'; + shell_exec($npmCmd); + + $npmCmd = 'npm rebuild'; + shell_exec($npmCmd); + + echo "Installing npm...\n\n"; + + if (!$verboseOutput) { + $silentOptions = ' --no-optional --ignore-scripts --silent'; + } + + $npmCmd = 'npm install' . $silentOptions; + shell_exec($npmCmd); + } + + $compileThemeCommand = $this->getApplication()->find('app:theme:rebuild'); + + $arguments = [ + 'command' => 'app:theme:rebuild' + ]; + + $compileThemeInput = new ArrayInput($arguments); + $returnCode = $compileThemeCommand->run($compileThemeInput, $output); + + $cmd = 'ng build --deploy-url public/'; + + shell_exec($cmd); + chdir($appDir); + + if (file_exists($rebuildEnginePath . '/dist/')) { + $this->file->makeDir(BASE_PATH . 'public/', 0777); + $this->file->deleteDirectory(BASE_PATH . 'public/'); + $this->file->recurseCopy($rebuildEnginePath . '/dist/', BASE_PATH . 'public/'); + } + + return true; + } + } +} diff --git a/core/modules/Administration/Cli/App/AppThemeRebuildCommand.php b/core/modules/Administration/Cli/App/AppThemeRebuildCommand.php new file mode 100644 index 000000000..889c928fe --- /dev/null +++ b/core/modules/Administration/Cli/App/AppThemeRebuildCommand.php @@ -0,0 +1,82 @@ +config = $config; + } + + /** + * @param InputInterface $input + * @param OutputInterface $output + * @return void + * @throws \Exception + */ + + public function execute(InputInterface $input, OutputInterface $output) + { + if (!file_exists(BASE_PATH . '/cache/app/engine/')) { + throw new \RuntimeException( + 'Can\'t find application engine folder, Please run bin/cli app:rebuild' + ); + } + + $watchCompiler = ''; + + $optionValue = $input->getOption('watch'); + + if ($optionValue === true) { + $watchCompiler = '--watch'; + } + + chdir(BASE_PATH . '/cache/app/engine/'); + + shell_exec( + "./node_modules/.bin/node-sass $watchCompiler --output-style compressed src/assets/themes/suite8/css/style.scss > src/assets/themes/suite8/css/style.min.css" + ); + + $compiledThemeDir = 'src/assets/themes/*/css/'; + $compiledThemeFile = 'style.min.css'; + + $compiledFilesCheck = shell_exec("find $compiledThemeDir -name '$compiledThemeFile' -print"); + + if ($compiledFilesCheck === null) { + throw new \RuntimeException( + 'Compiled theme files have failed to create. Check that the SuiteCRM 8 source theme files exist.' + ); + } + } + + protected function configure(): void + { + $this + ->setName('app:theme:rebuild') + ->setDescription('Rebuild the theme') + ->setHelp('This command will rebuild the theme') + ->addOption( + 'watch', + '', + InputOption::VALUE_NONE, + 'Option to allow developers to watch SASS files during compile' + ); + } +} diff --git a/core/modules/Administration/Cli/Composer/ComposerInstallCommand.php b/core/modules/Administration/Cli/Composer/ComposerInstallCommand.php new file mode 100644 index 000000000..d383669bc --- /dev/null +++ b/core/modules/Administration/Cli/Composer/ComposerInstallCommand.php @@ -0,0 +1,71 @@ +config = $config; + $this->file = new File(); + } + + protected function configure(): void + { + $this + ->setName('composer:install') + ->setDescription('Install core composer dependencies') + ->setHelp('This command will install all required project dependencies') + ->addOption( + 'nodev', + '', + InputOption::VALUE_NONE, + 'Install without dev packages' + ); + } + + /** + * @param InputInterface $input + * @param OutputInterface $output + * @return int|void|null + */ + public function execute(InputInterface $input, OutputInterface $output) + { + $currentDir = __DIR__ . '/../../../../../'; + + $optionValue = $input->getOption('nodev'); + $noDev = ($optionValue !== false); + + if ($noDev === true) { + shell_exec('composer install --no-dev'); + chdir($currentDir . 'legacy'); + + shell_exec('composer install --no-dev'); + chdir($currentDir); + } + + shell_exec('composer install'); + chdir($currentDir . 'legacy'); + + shell_exec('composer install'); + chdir($currentDir); + } +} diff --git a/core/modules/Administration/Cli/Composer/ComposerUpdateCommand.php b/core/modules/Administration/Cli/Composer/ComposerUpdateCommand.php new file mode 100644 index 000000000..3b808131e --- /dev/null +++ b/core/modules/Administration/Cli/Composer/ComposerUpdateCommand.php @@ -0,0 +1,53 @@ +config = $config; + $this->file = new File(); + } + + protected function configure(): void + { + $this + ->setName('composer:update') + ->setDescription('Update core composer dependencies') + ->setHelp('This command will install all required project dependencies'); + } + + /** + * @param InputInterface $input + * @param OutputInterface $output + * @return int|void|null + */ + public function execute(InputInterface $input, OutputInterface $output) + { + $currentDir = __DIR__ . '/../../../../../'; + + shell_exec('composer update'); + chdir($currentDir . 'legacy'); + + shell_exec('composer update'); + chdir($currentDir); + } +} diff --git a/core/modules/Administration/Cli/Modules/ListModulesCommand.php b/core/modules/Administration/Cli/Modules/ListModulesCommand.php new file mode 100644 index 000000000..f117996f6 --- /dev/null +++ b/core/modules/Administration/Cli/Modules/ListModulesCommand.php @@ -0,0 +1,63 @@ +setName('core:modules:list-all') + ->setDescription('List Application Modules') + ->setHelp('This command will list the possible Application Modules.'); + } + + /** + * @param InputInterface $input + * @param OutputInterface $output + * @return int|void|null + * @throws \Exception + */ + public function execute(InputInterface $input, OutputInterface $output) + { + $io = new SymfonyStyle($input, $output); + + $io->success('List of all modules.'); + + $parameterCollection = (new ConfigManager())->loadFiles( + [ + BASE_PATH . '/core/base/Config/modules.config.yml' + ] + ); + + $fileHelper = new File(); + + $modules = (new ModuleManager($parameterCollection, $fileHelper))->listEnabled(); + + $tableHeaders = [ + ['Module Name', 'Module Description'] + ]; + + for ($i = 0, $iMax = count($modules); $i < $iMax; $i++) { + $moduleData[$i] = [ + $modules[$i]->getName(), + $modules[$i]->getDescription() + ]; + } + + $io->table($tableHeaders, $moduleData); + } +} diff --git a/core/modules/Administration/Cli/Repair/QuickRepairRebuildCommand.php b/core/modules/Administration/Cli/Repair/QuickRepairRebuildCommand.php new file mode 100644 index 000000000..66332393d --- /dev/null +++ b/core/modules/Administration/Cli/Repair/QuickRepairRebuildCommand.php @@ -0,0 +1,33 @@ +setName('admin:repair:quick-repair-rebuild') + ->setDescription('Run Quick Repair and Rebuild') + ->setHelp('This command allows you to run the repair and rebuild.'); + } + + /** + * @param InputInterface $input + * @param OutputInterface $output + * @return int|void|null + */ + public function execute(InputInterface $input, OutputInterface $output) + { + } +} diff --git a/core/modules/Administration/Cli/Users/AddNewUserCommand.php b/core/modules/Administration/Cli/Users/AddNewUserCommand.php new file mode 100644 index 000000000..5bdc646b9 --- /dev/null +++ b/core/modules/Administration/Cli/Users/AddNewUserCommand.php @@ -0,0 +1,36 @@ +setName('admin:add-new-user') + ->setDescription('Add new user to the system') + ->setHelp('This command allows you to run the add new user to the system.'); + } + + /** + * @param InputInterface $input + * @param OutputInterface $output + * @return int|void + */ + public function execute(InputInterface $input, OutputInterface $output) + { + /** + * @todo : Create input for user before creating + */ + } +} diff --git a/core/modules/Users/Config/orm/OAuthAccessToken.orm.yml b/core/modules/Users/Config/orm/OAuthAccessToken.orm.yml new file mode 100644 index 000000000..e807c6d7d --- /dev/null +++ b/core/modules/Users/Config/orm/OAuthAccessToken.orm.yml @@ -0,0 +1,37 @@ +SuiteCRM\Core\Modules\Users\Entity\OAuthAccessToken: + type: entity + table: oauth_access_tokens + repositoryClass: SuiteCRM\Core\Modules\Users\Storage\OAuthAccessTokenStorage + id: + id: + type: integer + generator: + strategy: AUTO + fields: + token: + type: string + max_length: 40 + unique: true + client_id: + type: integer + user_id: + type: integer + nullable: true + expires: + type: datetime + #columnDefinition: TIMESTAMP + scope: + type: string + max_length: 50 + nullable: true + manyToOne: + client: + targetEntity: SuiteCRM\Core\Modules\Users\Entity\OAuthClient + joinColumn: + name: client_id + referencedColumnName: id + user: + targetEntity: SuiteCRM\Core\Modules\Users\Entity\OAuthUser + joinColumn: + name: user_id + referencedColumnName: id diff --git a/core/modules/Users/Config/orm/OAuthAuthorizationCode.orm.yml b/core/modules/Users/Config/orm/OAuthAuthorizationCode.orm.yml new file mode 100644 index 000000000..4794ab0f5 --- /dev/null +++ b/core/modules/Users/Config/orm/OAuthAuthorizationCode.orm.yml @@ -0,0 +1,42 @@ +SuiteCRM\Core\Modules\Users\Entity\OAuthAuthorizationCode: + type: entity + table: oauth_authorisation_codes + repositoryClass: SuiteCRM\Core\Modules\Users\Storage\OAuthAuthorizationCodeStorage + id: + id: + type: integer + generator: + strategy: AUTO + fields: + code: + type: string + max_length: 40 + unique: true + client_id: + type: integer + user_id: + type: integer + nullable: true + expires: + type: datetime + redirect_uri: + type: string + max_length: 200 + scope: + type: string + max_length: 50 + nullable: true + id_token: + type: string + length: 1000 + manyToOne: + client: + targetEntity: SuiteCRM\Core\Modules\Users\Entity\OAuthClient + joinColumn: + name: client_id + referencedColumnName: id + user: + targetEntity: SuiteCRM\Core\Modules\Users\Entity\OAuthUser + joinColumn: + name: user_id + referencedColumnName: id diff --git a/core/modules/Users/Config/orm/OAuthClient.orm.yml b/core/modules/Users/Config/orm/OAuthClient.orm.yml new file mode 100644 index 000000000..acdae338b --- /dev/null +++ b/core/modules/Users/Config/orm/OAuthClient.orm.yml @@ -0,0 +1,22 @@ +SuiteCRM\Core\Modules\Users\Entity\OAuthClient: + type: entity + table: oauth_client + repositoryClass: SuiteCRM\Core\Modules\Users\Storage\OAuthClientStorage + id: + id: + type: integer + generator: + strategy: AUTO + fields: + client_identifier: + type: string + max_length: 50 + unique: true + client_secret: + type: string + max_length: 20 + default: "" + redirect_uri: + type: string + max_length: 255 + default: "" \ No newline at end of file diff --git a/core/modules/Users/Config/orm/OAuthPublicKey.orm.yml b/core/modules/Users/Config/orm/OAuthPublicKey.orm.yml new file mode 100644 index 000000000..276a8125e --- /dev/null +++ b/core/modules/Users/Config/orm/OAuthPublicKey.orm.yml @@ -0,0 +1,22 @@ +SuiteCRM\Core\Modules\Users\Entity\OAuthPublicKey: + type: entity + table: oauth_public_key + repositoryClass: SuiteCRM\Core\Modules\Users\Storage\OAuthPublicKeyStorage + id: + id: + type: integer + generator: + strategy: AUTO + fields: + public_key: + type: string + length: 2000 + private_key: + type: string + length: 2000 + manyToOne: + client: + targetEntity: SuiteCRM\Core\Modules\Users\Entity\OAuthClient + joinColumn: + name: client_id + referencedColumnName: id diff --git a/core/modules/Users/Config/orm/OAuthRefreshToken.orm.yml b/core/modules/Users/Config/orm/OAuthRefreshToken.orm.yml new file mode 100644 index 000000000..db8331982 --- /dev/null +++ b/core/modules/Users/Config/orm/OAuthRefreshToken.orm.yml @@ -0,0 +1,37 @@ +SuiteCRM\Core\Modules\Users\Entity\OAuthRefreshToken: + type: entity + table: oauth_refresh_tokens + repositoryClass: SuiteCRM\Core\Modules\Users\Storage\OAuthRefreshTokenStorage + id: + id: + type: integer + generator: + strategy: AUTO + fields: + refresh_token: + refresh_token: string + max_length: 40 + unique: true + client_id: + type: integer + user_id: + type: integer + nullable: true + expires: + type: datetime + column: expires + scope: + type: string + max_length: 50 + nullable: true + manyToOne: + client: + targetEntity: SuiteCRM\Core\Modules\Users\Entity\OAuthClient + joinColumn: + name: client_id + referencedColumnName: id + user: + targetEntity: SuiteCRM\Core\Modules\Users\Entity\OAuthUser + joinColumn: + name: user_id + referencedColumnName: id diff --git a/core/modules/Users/Config/orm/OAuthUser.orm.yml b/core/modules/Users/Config/orm/OAuthUser.orm.yml new file mode 100644 index 000000000..fe53ea1a3 --- /dev/null +++ b/core/modules/Users/Config/orm/OAuthUser.orm.yml @@ -0,0 +1,20 @@ +SuiteCRM\Core\Modules\Users\Entity\OAuthUser: + type: entity + table: oauth_users + repositoryClass: SuiteCRM\Core\Modules\Users\Storage\OAuthUserStorage + id: + id: + type: integer + generator: + strategy: AUTO + fields: + username: + unique: true + type: string + column: user_name + password: + type: string + column: user_hash + indexes: + user_name_index: + columns: [ user_name ] diff --git a/core/modules/Users/Config/orm/OAuthUserClaims.orm.yml b/core/modules/Users/Config/orm/OAuthUserClaims.orm.yml new file mode 100644 index 000000000..114270d2c --- /dev/null +++ b/core/modules/Users/Config/orm/OAuthUserClaims.orm.yml @@ -0,0 +1,15 @@ +SuiteCRM\Core\Modules\Users\Entity\OAuthUserClaims: + type: entity + table: oauth_user_claims + repositoryClass: SuiteCRM\Core\Modules\Users\Storage\OAuthUserClaimsStorage + id: + id: + type: integer + generator: + strategy: AUTO + manyToOne: + user: + targetEntity: SuiteCRM\Core\Modules\Users\Entity\OAuthUser + joinColumn: + name: user_id + referencedColumnName: id diff --git a/core/modules/Users/Controller/Oauth.php b/core/modules/Users/Controller/Oauth.php new file mode 100644 index 000000000..1880f9b5a --- /dev/null +++ b/core/modules/Users/Controller/Oauth.php @@ -0,0 +1,213 @@ +requestObj); + $response = new OAuth2Response(); + // Load authentication service + $authenticationService = $this->getService('users.authentication'); + + // Load config parameters + $authenticationService->setConfig($this->config); + + // Get params + $username = $this->requestObj->request->get('username'); + $password = $this->requestObj->request->get('password'); + + if ($authenticationService->login($username, $password)) { + // Get storage classes + $clientStorage = $this->getStorage('users.oAuthClient'); + $userStorage = $this->getStorage('users.oAuthUser'); + $accessTokenStorage = $this->getStorage('users.oAuthAccessToken'); + $authorizationCodeStorage = $this->getStorage('users.oAuthAuthorizationCode'); + $refreshTokenStorage = $this->getStorage('users.oAuthRefreshToken'); + + $storage = [ + 'client_credentials' => $clientStorage, + 'user_credentials' => $userStorage, + 'access_token' => $accessTokenStorage, + 'authorization_code' => $authorizationCodeStorage, + 'refresh_token' => $refreshTokenStorage, + ]; + + $config = []; + + // Set up oauth2 server + $server = new OAuth2Server( + $storage, + $config + ); + + // Grant token with client details are in system + if (!$token = $server->grantAccessToken($request, $response)) { + $response->send(); + die(); + } + + // Output token in json format + $this->responseObj->headers->set('Content-Type', 'application/json'); + + return $this->responseObj + ->setContent( + json_encode($token) + ) + ->send(); + } + + // Response with unauthorised. + $this->responseObj->headers->set('Content-Type', 'application/json'); + + return $this->responseObj + ->setContent( + json_encode( + [ + 'message' => 'Authentication: Unauthorised', + 'code' => '401', + ] + ) + ) + ->setStatusCode(401) + ->send(); + } + + public function actionLogout(): void + { + $request = \OAuth2\HttpFoundationBridge\Request::createFromRequest($this->requestObj); + + $clientStorage = $this->getStorage('users.oAuthClient'); + $userStorage = $this->getStorage('users.oAuthUser'); + $accessTokenStorage = $this->getStorage('users.oAuthAccessToken'); + $authorizationCodeStorage = $this->getStorage('users.oAuthAuthorizationCode'); + $refreshTokenStorage = $this->getStorage('users.oAuthRefreshToken'); + + $storage = [ + 'client_credentials' => $clientStorage, + 'user_credentials' => $userStorage, + 'access_token' => $accessTokenStorage, + 'authorization_code' => $authorizationCodeStorage, + 'refresh_token' => $refreshTokenStorage, + ]; + + $config = []; + + $server = new OAuth2Server( + $storage, + $config + ); + + // Handle a request to a resource and authenticate the access token + if (!$server->verifyResourceRequest($request)) { + var_dump($server->getResponse()); + die(); + } + + $accessToken = $this->requestObj->request->get('access_token'); + $refreshAccessToken = $this->requestObj->request->get('refresh_token'); + + $accessTokenStorage->expireToken($accessToken); + $refreshTokenStorage->expireToken($refreshAccessToken); + + echo json_encode(['success' => true, 'message' => 'Logout Success']); + } + + public function refreshToken(): void + { + } + + public function actionAccessToken(): void + { +// $config = array(); +// +// $requestObj = \OAuth2\HttpFoundationBridge\Request::createFromRequest($this->requestObj); +// +// $clientStorage = $this->getStorage('users.oAuthClient'); +// $userStorage = $this->getStorage('users.oAuthUser'); +// $accessTokenStorage = $this->getStorage('users.oAuthAccessToken'); +// $authorizationCodeStorage = $this->getStorage('users.oAuthAuthorizationCode'); +// $refreshTokenStorage = $this->getStorage('users.oAuthRefreshToken'); +// $publicKeyStorage = $this->getStorage('users.oAuthPublicKey'); +// +// $storage = array( +// 'client_credentials' => $clientStorage, +// 'user_credentials' => $userStorage, +// 'access_token' => $accessTokenStorage, +// 'authorization_code' => $authorizationCodeStorage, +// 'refresh_token' => $refreshTokenStorage +// ); +// +// $grantType = $requestObj->request->get('grant_type'); +// +// if ($grantType == 'refresh_token') { +// // Set default refresh token parameters +// $refreshTokenLifetime = 10; +// $alwaysIssueNewRefreshToken = false; +// +// // Get config refresh token parameters if set +// if ($this->config->has('app.refresh_token_lifetime')) { +// $refreshAccessToken = (int) $this->config->get('app.refresh_token_lifetime'); +// } +// +// if ($this->config->has('app.always_issue_new_refresh_token')) { +// $alwaysIssueNewRefreshToken = (boolean) $this->config->get('app.always_issue_new_refresh_token'); +// } +// +// $config = array( +// 'always_issue_new_refresh_token' => $alwaysIssueNewRefreshToken, +// 'refresh_token_lifetime' => $refreshTokenLifetime, +// ); +// } +// +// $server = new OAuth2Server($storage, $config); +// +// if ($grantType == 'password') { +//// $username = $params['user_name']; +//// $password = $params['user_hash']; +// +// // Add the grant type to your OAuth server +// $server->addGrantType(new OAuth2GrantTypeUserCredentials($userStorage)); +// +// $config = array(); +// } elseif ($grantType == "refresh_token") { +// // Add the grant type to your OAuth server +// +// $objectGrantType = new OAuth2GrantTypeRefreshToken($refreshTokenStorage); +// +// $server->addGrantType($objectGrantType); +// +// // The refresh token +// $accessToken = new OAuth2ResponseTypeAccessToken($accessTokenStorage, $refreshTokenStorage, array( +// 'refresh_token_lifetime' => $refreshTokenLifetime, +// )); +// +// $server = new OAuth2Server($storage, $config, [$objectGrantType], array($accessToken)); +// } else { +// throw new \Exception('Grant type - not supported.'); +// } +// +// $tokenResponse = $server->handleTokenRequest($requestObj); +// +// $statusCode = $tokenResponse->getStatusCode(); +// $parameters = $tokenResponse->getParameters(); +// +// return $tokenResponse->send(); + } +} diff --git a/core/modules/Users/Entity/EncryptableField.php b/core/modules/Users/Entity/EncryptableField.php new file mode 100644 index 000000000..aa6403767 --- /dev/null +++ b/core/modules/Users/Entity/EncryptableField.php @@ -0,0 +1,31 @@ + 11]; + + /** + * @param $value + * @return mixed + */ + protected function encryptField($value) + { + return $value; + + // return password_hash( + // $value, PASSWORD_BCRYPT, $this->hashOptions); + } + + /** + * @param $encryptedValue + * @param $value + * @return bool + */ + protected function verifyEncryptedFieldValue($encryptedValue, $value): bool + { + return ($encryptedValue == $value); + //return password_verify($value, $encryptedValue); + } +} diff --git a/core/modules/Users/Entity/OAuthAccessToken.php b/core/modules/Users/Entity/OAuthAccessToken.php new file mode 100644 index 000000000..083096e93 --- /dev/null +++ b/core/modules/Users/Entity/OAuthAccessToken.php @@ -0,0 +1,248 @@ +id; + } + + /** + * Set token + * + * @param string $token + * @return OAuthAccessToken + */ + public function setToken($token): OAuthAccessToken + { + $this->token = $token; + + return $this; + } + + /** + * Get token + * + * @return string + */ + public function getToken(): string + { + return $this->token; + } + + /** + * Set client_id + * + * @param string $clientId + * @return OAuthAccessToken + */ + public function setClientId($clientId): OAuthAccessToken + { + $this->client_id = $clientId; + + return $this; + } + + /** + * Get client_id + * + * @return string + */ + public function getClientId(): string + { + return $this->client_id; + } + + /** + * Set user_id + * + * @param $userId + * @return OAuthAccessToken + */ + public function setUserId($userId): OAuthAccessToken + { + $this->user_id = $userId; + + return $this; + } + + /** + * Get user_identifier + * + * @return string + */ + public function getUserId(): string + { + return $this->user_id; + } + + /** + * Set expires + * + * @param \DateTime $expires + * @return OAuthAccessToken + */ + public function setExpires($expires): OAuthAccessToken + { + $this->expires = $expires; + + return $this; + } + + /** + * Get expires + * + * @return \DateTime + */ + public function getExpires(): \DateTime + { + return $this->expires; + } + + /** + * Set scope + * + * @param string $scope + * @return OAuthAccessToken + */ + public function setScope($scope): OAuthAccessToken + { + $this->scope = $scope; + + return $this; + } + + /** + * Get scope + * + * @return string + */ + public function getScope(): string + { + return $this->scope; + } + + /** + * Set client + * + * @param SuiteCRM\Core\Modules\Users\Entity\OAuthClient $client + * @return OAuthAccessToken + */ + public function setClient(SuiteCRM\Core\Modules\Users\Entity\OAuthClient $client = null): OAuthAccessToken + { + $this->client = $client; + + return $this; + } + + /** + * Get client + * + * @return SuiteCRM\Core\Modules\Users\Entity\OAuthClient + */ + public function getClient(): SuiteCRM\Core\Modules\Users\Entity\OAuthClient + { + return $this->client; + } + + /** + * @param $params + * @return OAuthAccessToken + */ + public static function fromArray($params): OAuthAccessToken + { + $token = new self(); + foreach ($params as $property => $value) { + $token->$property = $value; + } + + return $token; + } + + /** + * Set user + * + * @param SuiteCRM\Core\Modules\Users\Entity\OAuthUser $user + * @return OAuthRefreshToken + */ + public function setUser(SuiteCRM\Core\Modules\Users\Entity\OAuthUser $user = null): OAuthRefreshToken + { + $this->user = $user; + + return $this; + } + + /** + * Get user + * + * @return SuiteCRM\Core\Modules\Users\Entity\OAuthUser + */ + public function getUser(): SuiteCRM\Core\Modules\Users\Entity\OAuthUser + { + return $this->client; + } + + /** + * @return array + */ + public function toArray(): array + { + return [ + 'token' => $this->token, + 'client_id' => $this->client_id, + 'user_id' => $this->user_id, + 'expires' => $this->expires, + 'scope' => $this->scope, + ]; + } +} diff --git a/core/modules/Users/Entity/OAuthAuthorizationCode.php b/core/modules/Users/Entity/OAuthAuthorizationCode.php new file mode 100644 index 000000000..4bd8b4e47 --- /dev/null +++ b/core/modules/Users/Entity/OAuthAuthorizationCode.php @@ -0,0 +1,303 @@ +id; + } + + /** + * Set code + * + * @param string $code + * @return OAuthAuthorizationCode + */ + public function setCode($code): OAuthAuthorizationCode + { + $this->code = $code; + + return $this; + } + + /** + * Get code + * + * @return string + */ + public function getCode(): string + { + return $this->code; + } + + /** + * Set client_id + * + * @param string $clientId + * @return OAuthAuthorizationCode + */ + public function setClientId($clientId): OAuthAuthorizationCode + { + $this->client_id = $clientId; + + return $this; + } + + /** + * Get client_id + * + * @return string + */ + public function getClientId(): string + { + return $this->client_id; + } + + /** + * Set user_id + * + * @param $userId + * @return OAuthAuthorizationCode + */ + public function setUserId($userId): OAuthAuthorizationCode + { + $this->user_id = $userId; + + return $this; + } + + /** + * Get user_identifier + * + * @return string + */ + public function getUserId(): string + { + return $this->user_id; + } + + /** + * Set expires + * + * @param \DateTime $expires + * @return OAuthAuthorizationCode + */ + public function setExpires($expires): OAuthAuthorizationCode + { + $this->expires = $expires; + + return $this; + } + + /** + * Get expires + * + * @return \DateTime + */ + public function getExpires(): \DateTime + { + return $this->expires; + } + + /** + * Set redirect_uri + * + * @param string $redirectUri + * @return OAuthAuthorizationCode + */ + public function setRedirectUri($redirectUri): OAuthAuthorizationCode + { + $this->redirect_uri = $redirectUri; + + return $this; + } + + /** + * Get redirect_uri + * + * @return string + */ + public function getRedirectUri(): string + { + return $this->redirect_uri; + } + + /** + * Set scope + * + * @param string $scope + * @return OAuthAuthorizationCode + */ + public function setScope($scope): OAuthAuthorizationCode + { + $this->scope = $scope; + + return $this; + } + + /** + * Get scope + * + * @return string + */ + public function getScope(): string + { + return $this->scope; + } + + /** + * Set client + * + * @param OAuthClient $client + * @return OAuthAuthorizationCode + */ + public function setClient(OAuthClient $client = null): OAuthAuthorizationCode + { + $this->client = $client; + + return $this; + } + + /** + * Get client + * + * @return OAuthClient + */ + public function getClient(): OAuthClient + { + return $this->client; + } + + /** + * Set user + * + * @param OAuthUser $user + * @return OAuthRefreshToken + */ + public function setUser(OAuthUser $user = null): OAuthRefreshToken + { + $this->user = $user; + + return $this; + } + + /** + * Get user + * + * @return \YourNamespace\Entity\OAuthUser + */ + public function getUser(): \YourNamespace\Entity\OAuthUser + { + return $this->client; + } + + /** + * @return array + */ + public function toArray(): array + { + return [ + 'code' => $this->code, + 'client_id' => $this->client_id, + 'user_id' => $this->user_id, + 'expires' => $this->expires, + 'scope' => $this->scope, + ]; + } + + /** + * @param $params + * @return OAuthAuthorizationCode + */ + public static function fromArray($params): OAuthAuthorizationCode + { + $code = new self(); + foreach ($params as $property => $value) { + $code->$property = $value; + } + + return $code; + } + + /** + * Get the value of Id Token + * + * @return string + */ + public function getIdToken(): string + { + return $this->id_token; + } + + /** + * Set the value of Id Token + * + * @param string id_token + * + * @return self + */ + public function setIdToken($id_token): self + { + $this->id_token = $id_token; + + return $this; + } + +} diff --git a/core/modules/Users/Entity/OAuthClient.php b/core/modules/Users/Entity/OAuthClient.php new file mode 100644 index 000000000..4a827d8b8 --- /dev/null +++ b/core/modules/Users/Entity/OAuthClient.php @@ -0,0 +1,195 @@ + $val) { + if (property_exists($this, $key)) { + $this->{$key} = $val; + } + } + + if ($this->id == 0) { + $this->created_date = new \DateTime(); + } + + $this->modified_date = new \DateTime(); + } + + /** + * Get id + * + * @return int + */ + public function getId(): int + { + return $this->id; + } + + /** + * Set client_identifier + * + * @param string $clientIdentifier + * @return OAuthClient + */ + public function setClientIdentifier($clientIdentifier): OAuthClient + { + $this->client_identifier = $clientIdentifier; + + return $this; + } + + /** + * Get client_identifier + * + * @return string + */ + public function getClientIdentifier(): string + { + return $this->client_identifier; + } + + /** + * Set client_secret + * + * @param string $clientSecret + * @return OAuthClient + */ + public function setClientSecret($clientSecret): OAuthClient + { + $this->client_secret = $this->encryptField($clientSecret); + + return $this; + } + + /** + * Get client_secret + * + * @return string + */ + public function getClientSecret(): string + { + return $this->client_secret; + } + + /** + * Verify client's secret + * + * @param $clientSecret + * @return Boolean + */ + public function verifyClientSecret($clientSecret): bool + { + return $this->verifyEncryptedFieldValue($this->getClientSecret(), $clientSecret); + } + + /** + * Set redirect_uri + * + * @param string $redirectUri + * @return OAuthClient + */ + public function setRedirectUri($redirectUri): OAuthClient + { + $this->redirect_uri = $redirectUri; + + return $this; + } + + /** + * Get redirect_uri + * + * @return string + */ + public function getRedirectUri(): string + { + return $this->redirect_uri; + } + + /** + * @return array + */ + public function toArray(): array + { + return [ + 'client_id' => $this->client_identifier, + 'client_secret' => $this->client_secret, + 'redirect_uri' => $this->redirect_uri, + ]; + } + + /** + * Set the value of Id + * + * @param int id + * + * @return self + */ + public function setId($id): self + { + $this->id = $id; + + return $this; + } + + /** + * Get the value of Status + * + * @return mixed + */ + public function getStatus() + { + return $this->status; + } + + /** + * Set the value of Status + * + * @param mixed status + * + * @return self + */ + public function setStatus($status): self + { + $this->status = $status; + + return $this; + } + +} diff --git a/core/modules/Users/Entity/OAuthPublicKey.php b/core/modules/Users/Entity/OAuthPublicKey.php new file mode 100644 index 000000000..dbb328f4e --- /dev/null +++ b/core/modules/Users/Entity/OAuthPublicKey.php @@ -0,0 +1,127 @@ +id; + } + + /** + * Set the value of Id + * + * @param integar id + * + * @return self + */ + public function setId(integar $id): self + { + $this->id = $id; + + return $this; + } + + /** + * Get the value of Public Key + * + * @return string + */ + public function getPublicKey(): string + { + return $this->public_key; + } + + /** + * Set the value of Public Key + * + * @param string public_key + * + * @return self + */ + public function setPublicKey($public_key): self + { + $this->public_key = $public_key; + + return $this; + } + + /** + * Get the value of Private Key + * + * @return string + */ + public function getPrivateKey(): string + { + return $this->private_key; + } + + /** + * Set the value of Private Key + * + * @param string private_key + * + * @return self + */ + public function setPrivateKey($private_key): self + { + $this->private_key = $private_key; + + return $this; + } + + /** + * Set client + * + * @param OAuthClient $client + * @return OAuthAuthorizationCode + */ + public function setClient(OAuthClient $client = null): OAuthAuthorizationCode + { + $this->client = $client; + + return $this; + } + + /** + * Get client + * + * @return \YourNamespace\Entity\OAuthClient + */ + public function getClient(): \YourNamespace\Entity\OAuthClient + { + return $this->client; + } + +} diff --git a/core/modules/Users/Entity/OAuthRefreshToken.php b/core/modules/Users/Entity/OAuthRefreshToken.php new file mode 100644 index 000000000..43f99ee06 --- /dev/null +++ b/core/modules/Users/Entity/OAuthRefreshToken.php @@ -0,0 +1,245 @@ +id; + } + + /** + * Set refresh_token + * + * @param string $refresh_token + * @return OAuthRefreshToken + */ + public function setRefreshToken($refresh_token): OAuthRefreshToken + { + $this->refresh_token = $refresh_token; + + return $this; + } + + /** + * Get refresh_token + * + * @return string + */ + public function getRefreshToken(): string + { + return $this->refresh_token; + } + + /** + * Set client_id + * + * @param string $clientId + * @return OAuthRefreshToken + */ + public function setClientId($clientId): OAuthRefreshToken + { + $this->client_id = $clientId; + + return $this; + } + + /** + * Get client_id + * + * @return string + */ + public function getClientId(): string + { + return $this->client_id; + } + + /** + * Set user_id + * + * @param $userId + * @return OAuthRefreshToken + */ + public function setUserId($userId): OAuthRefreshToken + { + $this->user_id = $userId; + + return $this; + } + + /** + * Get user_identifier + * + * @return string + */ + public function getUserId(): string + { + return $this->user_id; + } + + /** + * Set expires + * + * @param \DateTime $expires + * @return OAuthRefreshToken + */ + public function setExpires($expires): OAuthRefreshToken + { + $this->expires = $expires; + + return $this; + } + + /** + * Get expires + * + * @return \DateTime + */ + public function getExpires(): \DateTime + { + return $this->expires; + } + + /** + * Set scope + * + * @param string $scope + * @return OAuthRefreshToken + */ + public function setScope($scope): OAuthRefreshToken + { + $this->scope = $scope; + + return $this; + } + + /** + * Get scope + * + * @return string + */ + public function getScope(): string + { + return $this->scope; + } + + /** + * Set client + * + * @param SuiteCRM\Core\Modules\Users\Entity\OAuthClient $client + * @return OAuthRefreshToken + */ + public function setClient(SuiteCRM\Core\Modules\Users\Entity\OAuthClient $client = null): OAuthRefreshToken + { + $this->client = $client; + + return $this; + } + + /** + * Get client + * + * @return SuiteCRM\Core\Modules\Users\Entity\OAuthClient + */ + public function getClient(): SuiteCRM\Core\Modules\Users\Entity\OAuthClient + { + return $this->client; + } + + /** + * Set user + * + * @param SuiteCRM\Core\Modules\Users\Entity\OAuthUser $user + * @return OAuthRefreshToken + */ + public function setUser(SuiteCRM\Core\Modules\Users\Entity\OAuthUser $user = null): OAuthRefreshToken + { + $this->user = $user; + + return $this; + } + + /** + * Get user + * + * @return SuiteCRM\Core\Modules\Users\Entity\OAuthUser + */ + public function getUser(): SuiteCRM\Core\Modules\Users\Entity\OAuthUser + { + return $this->client; + } + + /** + * @return array + */ + public function toArray(): array + { + return [ + 'refresh_token' => $this->refresh_token, + 'client_id' => $this->client_id, + 'user_id' => $this->user_id, + 'expires' => $this->expires, + 'scope' => $this->scope, + ]; + } + + /** + * @param $params + * @return OAuthRefreshToken + */ + public static function fromArray($params): OAuthRefreshToken + { + $token = new self(); + foreach ($params as $property => $value) { + $token->$property = $value; + } + + return $token; + } +} diff --git a/core/modules/Users/Entity/OAuthUser.php b/core/modules/Users/Entity/OAuthUser.php new file mode 100644 index 000000000..b1774e936 --- /dev/null +++ b/core/modules/Users/Entity/OAuthUser.php @@ -0,0 +1,108 @@ +id; + } + + /** + * Set username + * + * @param $username + * @return User + */ + public function setUsername($username): User + { + $this->username = $username; + + return $this; + } + + /** + * Get username + * + * @return string + */ + public function getUsername(): string + { + return $this->username; + } + + /** + * Set password + * + * @param string $password + * @return User + */ + public function setPassword($password): User + { + $this->password = $this->encryptField($password); + + return $this; + } + + /** + * Get password + * + * @return string + */ + public function getPassword(): string + { + return $this->password; + } + + /** + * Verify user's password + * + * @param string $password + * @return Boolean + */ + public function verifyPassword($password): bool + { + return $this->verifyEncryptedFieldValue($this->getPassword(), $password); + } + + /** + * Get OAuthUser object in array format + * + * @return array + */ + public function toArray(): array + { + return [ + 'user_id' => $this->id, + 'scope' => null, + ]; + } +} diff --git a/core/modules/Users/Entity/OAuthUserClaims.php b/core/modules/Users/Entity/OAuthUserClaims.php new file mode 100644 index 000000000..22b6db699 --- /dev/null +++ b/core/modules/Users/Entity/OAuthUserClaims.php @@ -0,0 +1,99 @@ +id; + } + + /** + * Set the value of Id + * + * @param string id + * + * @return self + */ + public function setId($id): self + { + $this->id = $id; + + return $this; + } + + /** + * Get the value of Id Token + * + * @return string + */ + public function getIdToken(): string + { + return $this->id_token; + } + + /** + * Set the value of Id Token + * + * @param string id_token + * + * @return self + */ + public function setIdToken($id_token): self + { + $this->id_token = $id_token; + + return $this; + } + + /** + * Get the value of User Id + * + * @return string + */ + public function getUserId(): string + { + return $this->user_id; + } + + /** + * Set the value of User Id + * + * @param string user_id + * + * @return self + */ + public function setUserId($user_id): self + { + $this->user_id = $user_id; + + return $this; + } + +} diff --git a/core/modules/Users/Entity/UserProfile.php b/core/modules/Users/Entity/UserProfile.php new file mode 100644 index 000000000..a441297f4 --- /dev/null +++ b/core/modules/Users/Entity/UserProfile.php @@ -0,0 +1,13 @@ +findOneBy(['token' => $oauthToken]); + + if ($token) { + $token = $token->toArray(); + $token['expires'] = $token['expires']->getTimestamp(); + } + + return $token; + } + + /** + * @param string $oauthToken + * @param mixed $clientIdentifier + * @param mixed $user_id + * @param int $expires + * @param null $scope + * @throws \Doctrine\ORM\ORMException + * @throws \Doctrine\ORM\OptimisticLockException + */ + public function setAccessToken($oauthToken, $clientIdentifier, $user_id, $expires, $scope = null) + { + $client = $this->_em->getRepository('SuiteCRM\Core\Modules\Users\Entity\OAuthClient') + ->findOneBy(['client_identifier' => $clientIdentifier]); + + $user = $this->_em->getRepository('SuiteCRM\Core\Modules\Users\Entity\OAuthUser') + ->findOneBy(['id' => $user_id]); + + $client_id = $client->getId(); + + $token = OAuthAccessToken::fromArray( + [ + 'token' => $oauthToken, + 'client_id' => $client_id, + 'user_id' => $user_id, + 'expires' => (new \DateTime())->setTimestamp($expires), + 'scope' => $scope, + 'user' => $user, + 'client' => $client, + ] + ); + + $this->_em->persist($token); + $this->_em->flush(); + } + + /** + * Delete a row + * + * @param string $token + * @return bool + * @throws \Doctrine\ORM\ORMException + * @throws \Doctrine\ORM\OptimisticLockException + */ + public function expireToken($token): bool + { + $token = $this->findOneBy(['token' => $token]); + + if (!empty($token)) { + $ts = time(); + + $datetime = new \DateTime(); + $datetime->setTimestamp($ts); + + $token->setExpires($datetime); + + $this->_em->merge($token); + + return $this->_em->flush(); + } + + throw new \RuntimeException('No Token Found.'); + } + +} diff --git a/core/modules/Users/Storage/OAuthAuthorizationCodeStorage.php b/core/modules/Users/Storage/OAuthAuthorizationCodeStorage.php new file mode 100644 index 000000000..d196d519c --- /dev/null +++ b/core/modules/Users/Storage/OAuthAuthorizationCodeStorage.php @@ -0,0 +1,82 @@ +findOneBy(['code' => $code]); + + if ($authCode) { + $authCode = $authCode->toArray(); + $authCode['expires'] = $authCode['expires']->getTimestamp(); + } + + return $authCode; + } + + /** + * @param string $code + * @param mixed $client_id + * @param mixed $user_id + * @param string $redirect_uri + * @param int $expires + * @param null $scope + * @param null $id_token + * @throws \Doctrine\ORM\ORMException + * @throws \Doctrine\ORM\OptimisticLockException + */ + public function setAuthorizationCode( + $code, + $client_id, + $user_id, + $redirect_uri, + $expires, + $scope = null, + $id_token = null + ) { + $client = $this->_em->getRepository('SuiteCRM\Core\Modules\Users\Entity\OAuthClient') + ->findOneBy(['client_identifier' => $client_id]); + + $user = $this->_em->getRepository('SuiteCRM\Core\Modules\Users\Entity\OAuthUser') + ->findOneBy(['user_name' => $user_id]); + + $authCode = OAuthAuthorizationCode::fromArray( + [ + 'code' => $code, + 'client' => $client, + 'user' => $user, + 'redirect_uri' => $redirect_uri, + 'expires' => (new \DateTime())->setTimestamp($expires), + 'scope' => $scope, + 'id_token' => $id_token + ] + ); + + $this->_em->persist($authCode); + $this->_em->flush(); + } + + /** + * @param $code + * @throws \Doctrine\ORM\ORMException + * @throws \Doctrine\ORM\OptimisticLockException + */ + public function expireAuthorizationCode($code) + { + $authCode = $this->findOneBy(['code' => $code]); + $this->_em->remove($authCode); + $this->_em->flush(); + } +} diff --git a/core/modules/Users/Storage/OAuthClientStorage.php b/core/modules/Users/Storage/OAuthClientStorage.php new file mode 100644 index 000000000..bbfbc5538 --- /dev/null +++ b/core/modules/Users/Storage/OAuthClientStorage.php @@ -0,0 +1,102 @@ +getEntity($client); + + if (empty($clientEntity->getId())) { + $this->_em->persist($clientEntity); + } else { + $this->_em->merge($clientEntity); + } + + $this->_em->flush(); + } + + /** + * @param $clientIdentifier + * @return array|object|null + */ + public function getClientDetails($clientIdentifier) + { + $client = $this->findOneBy(['client_identifier' => $clientIdentifier]); + if ($client) { + $client = $client->toArray(); + } + + return $client; + } + + /** + * @param $clientIdentifier + * @param null $clientSecret + * @return bool + */ + public function checkClientCredentials($clientIdentifier, $clientSecret = null) + { + $client = $this->findOneBy(['client_identifier' => $clientIdentifier]); + if ($client) { + return $client->verifyClientSecret($clientSecret); + } + + return false; + } + + /** + * @param $clientId + * @param $grantType + * @return bool + */ + public function checkRestrictedGrantType($clientId, $grantType) + { + // we do not support different grant types per client in this example + return true; + } + + /** + * @param $clientId + * @return bool + */ + public function isPublicClient($clientId) + { + return false; + } + + /** + * @param $clientId + * @return null |null + */ + public function getClientScope($clientId) + { + return null; + } + + /** + * Get Contact Entity + * + * @param array $entityData + * @return \Mvc\Entity\Contact + * @throws \Exception + */ + public function getEntity($entityData = []): \Mvc\Entity\Contact + { + return new OAuthClient($entityData); + } + +} diff --git a/core/modules/Users/Storage/OAuthPublicKeyStorage.php b/core/modules/Users/Storage/OAuthPublicKeyStorage.php new file mode 100644 index 000000000..32ccb898b --- /dev/null +++ b/core/modules/Users/Storage/OAuthPublicKeyStorage.php @@ -0,0 +1,33 @@ +findOneBy(['refresh_token' => $refreshToken]); + + if ($refreshToken) { + $refreshToken = $refreshToken->toArray(); + $refreshToken['expires'] = $refreshToken['expires']->getTimestamp(); + } + + return $refreshToken; + } + + /** + * @param $refreshToken + * @param $clientIdentifier + * @param $user_id + * @param $expires + * @param null $scope + * @throws ORMException + * @throws OptimisticLockException + */ + public function setRefreshToken($refreshToken, $clientIdentifier, $user_id, $expires, $scope = null) + { + $client = $this->_em->getRepository('SuiteCRM\Core\Modules\Users\Entity\OAuthClient') + ->findOneBy(['client_identifier' => $clientIdentifier]); + + $client_id = $client->getId(); + + $user = $this->_em->getRepository('SuiteCRM\Core\Modules\Users\Entity\OAuthUser') + ->findOneBy(['id' => $user_id]); + + $refreshToken = OAuthRefreshToken::fromArray( + [ + 'refresh_token' => $refreshToken, + 'client' => $client, + 'user' => $user, + 'expires' => (new \DateTime())->setTimestamp($expires), + 'scope' => $scope, + 'client_id' => $client_id, + 'user_id' => $user_id, + ] + ); + + $this->_em->persist($refreshToken); + $this->_em->flush(); + } + + /** + * @param $refreshToken + * @throws ORMException + * @throws OptimisticLockException + */ + public function unsetRefreshToken($refreshToken) + { + $refreshToken = $this->findOneBy(['refresh_token' => $refreshToken]); + $this->_em->remove($refreshToken); + $this->_em->flush(); + } + + /** + * Delete a row + * + * @param string $token + * @return bool + * @throws ORMException + * @throws OptimisticLockException + */ + public function expireToken($token): bool + { + $token = $this->findOneBy(['refresh_token' => $token]); + + if (!empty($token)) { + $ts = time(); + + $datetime = new \DateTime(); + $datetime->setTimestamp($ts); + + $token->setExpires($datetime); + + $this->_em->merge($token); + + return $this->_em->flush(); + } + + throw new \RuntimeException('No Token Found.'); + } +} diff --git a/core/modules/Users/Storage/OAuthUserClaimsStorage.php b/core/modules/Users/Storage/OAuthUserClaimsStorage.php new file mode 100644 index 000000000..1edf1acdf --- /dev/null +++ b/core/modules/Users/Storage/OAuthUserClaimsStorage.php @@ -0,0 +1,80 @@ +getUserDetails($user_id)) { + return false; + } + + $claims = explode(' ', trim($claims)); + + $userClaims = []; + // for each requested claim, if the user has the claim, set it in the response + $validClaims = explode(' ', self::VALID_CLAIMS); + + foreach ($validClaims as $validClaim) { + if (in_array($validClaim, $claims, true)) { + if ($validClaim == 'address') { + // address is an object with subfields + $userClaims['address'] = $this->getUserClaim($validClaim, $userDetails['address'] ?: $userDetails); + } else { + $userClaims = array_merge($userClaims, $this->getUserClaim($validClaim, $userDetails)); + } + } + } + + return $userClaims; + } + + /** + * @param $claim + * @param $userDetails + * @return array + */ + protected function getUserClaim($claim, $userDetails) + { + $userClaims = []; + $claimValuesString = constant(sprintf('self::%s_CLAIM_VALUES', strtoupper($claim))); + $claimValues = explode(' ', $claimValuesString); + foreach ($claimValues as $value) { + $userClaims[$value] = isset($userDetails[$value]) ? $userDetails[$value] : null; + } + + return $userClaims; + } + + /** + * @param $username + * @return array|bool + */ + public function getUserDetails($username) + { + if (!isset($this->userCredentials[$username])) { + return false; + } + + return array_merge( + [ + 'user_id' => $username, + 'password' => null, + 'first_name' => null, + 'last_name' => null, + ], + $this->userCredentials[$username] + ); + } +} diff --git a/core/modules/Users/Storage/OAuthUserStorage.php b/core/modules/Users/Storage/OAuthUserStorage.php new file mode 100644 index 000000000..b72b31a6d --- /dev/null +++ b/core/modules/Users/Storage/OAuthUserStorage.php @@ -0,0 +1,68 @@ +findOneBy(['user_name' => $username]); +// +// if ($user) { +// return $user->verifyPassword($password); +// } +// +// return false; + + return true; + } + + /** + * @param $username + * @return object|null ARRAY the associated "user_id" and optional "scope" values + * ARRAY the associated "user_id" and optional "scope" values + * This function MUST return FALSE if the requested user does not exist or is + * invalid. "scope" is a space-separated list of restricted scopes. + * @code + * return array( + * "user_id" => USER_ID, // REQUIRED user_id to be stored with the authorization code or access token + * "scope" => SCOPE // OPTIONAL space-separated list of restricted scopes + * ); + * @endcode + */ + public function getUserDetails($username) + { + $user = $this->findOneBy(['username' => $username]); + + if ($user) { + $user = $user->toArray(); + } + + return $user; + } + +// public function setSessionId($accesstoken, $session_id) +// { +// $tokenEntity = $this->_em->getRepository('SuiteCRM\Core\Modules\Users\Entity\oAuthAccessToken') +// ->findOneBy(['token' => $accesstoken]); +// +// $userId = $tokenEntity->getUserId(); +// +// $userEntity = $this->_em->getRepository('SuiteCRM\Core\Modules\Users\Entity\oAuthUser') +// ->findOneBy(['id' => $userId]); +// +// $userEntity->setSessionId($session_id); +// +// $this->_em->merge($userEntity); +// +// $this->_em->flush(); +// } +} diff --git a/core/modules/Users/Users.php b/core/modules/Users/Users.php new file mode 100644 index 000000000..f5ec6590d --- /dev/null +++ b/core/modules/Users/Users.php @@ -0,0 +1,24 @@ +template->get('template/default.json'); diff --git a/core/tests/phpunit.sh b/core/tests/phpunit.sh new file mode 100644 index 000000000..4bc389f78 --- /dev/null +++ b/core/tests/phpunit.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +php "$PWD"/../../vendor/bin/phpunit --coverage-html coverage/html $@ diff --git a/core/tests/phpunit.xml.dist b/core/tests/phpunit.xml.dist new file mode 100644 index 000000000..a6e2962f2 --- /dev/null +++ b/core/tests/phpunit.xml.dist @@ -0,0 +1,39 @@ + + + + + ./unit/phpunit + + + + + + ../base + ../modules + ../legacy + + + + + + + + + + + + + diff --git a/core/tests/testdata/CommandMapperTest/config.yml b/core/tests/testdata/CommandMapperTest/config.yml new file mode 100644 index 000000000..570a7f650 --- /dev/null +++ b/core/tests/testdata/CommandMapperTest/config.yml @@ -0,0 +1,20 @@ +app: + default_route: + action: "login" +server: + environment: 'develop' +storage: + mysql: + driver: 'pdo_mysql' + host: 'mariadb' + dbname: 'suitecrm_8_app' + user: 'root' + password: '' + io: 'both' +entity: + namespaces: + core/modules/Users/Config/orm: 'SuiteCRM\Core\Modules\Users\Entity' +modules: + enabled: + - Users + - Administration \ No newline at end of file diff --git a/core/tests/testdata/CommandMapperTest/noenabledmodules.config.yml b/core/tests/testdata/CommandMapperTest/noenabledmodules.config.yml new file mode 100644 index 000000000..3df56a9db --- /dev/null +++ b/core/tests/testdata/CommandMapperTest/noenabledmodules.config.yml @@ -0,0 +1,13 @@ +server: + environment: 'develop' +storage: + mysql: + driver: 'pdo_mysql' + host: 'mariadb' + dbname: 'suitecrm_8_app' + user: 'root' + password: '' + io: 'both' +modules: + paths: + - /../../modules/ \ No newline at end of file diff --git a/core/tests/testdata/ConfigTest/LoadEmpty/config.yml b/core/tests/testdata/ConfigTest/LoadEmpty/config.yml new file mode 100644 index 000000000..e69de29bb diff --git a/core/tests/testdata/ConfigTest/LoadMultiple/config_1.yml b/core/tests/testdata/ConfigTest/LoadMultiple/config_1.yml new file mode 100644 index 000000000..0f4f2564b --- /dev/null +++ b/core/tests/testdata/ConfigTest/LoadMultiple/config_1.yml @@ -0,0 +1,9 @@ +config_1: + data_1: + param_1: 'param_1_value' + param_2: 'param_2_value' + param_3: 'param_3_value' + data_2: + param_1: 'param_1_value' + param_2: 'param_2_value' + param_3: 'param_3_value' \ No newline at end of file diff --git a/core/tests/testdata/ConfigTest/LoadMultiple/config_2.yml b/core/tests/testdata/ConfigTest/LoadMultiple/config_2.yml new file mode 100644 index 000000000..a6dffc263 --- /dev/null +++ b/core/tests/testdata/ConfigTest/LoadMultiple/config_2.yml @@ -0,0 +1,9 @@ +config_2: + data_1: + param_1: 'param_1_value' + param_2: 'param_2_value' + param_3: 'param_3_value' + data_2: + param_1: 'param_1_value' + param_2: 'param_2_value' + param_3: 'param_3_value' \ No newline at end of file diff --git a/core/tests/testdata/ConfigTest/LoadMultiple/config_3.yml b/core/tests/testdata/ConfigTest/LoadMultiple/config_3.yml new file mode 100644 index 000000000..dcab3c758 --- /dev/null +++ b/core/tests/testdata/ConfigTest/LoadMultiple/config_3.yml @@ -0,0 +1,9 @@ +config_3: + data_1: + param_1: 'param_1_value' + param_2: 'param_2_value' + param_3: 'param_3_value' + data_2: + param_1: 'param_1_value' + param_2: 'param_2_value' + param_3: 'param_3_value' \ No newline at end of file diff --git a/core/tests/testdata/ConfigTest/LoadSingle/config.yml b/core/tests/testdata/ConfigTest/LoadSingle/config.yml new file mode 100644 index 000000000..b166a039b --- /dev/null +++ b/core/tests/testdata/ConfigTest/LoadSingle/config.yml @@ -0,0 +1,9 @@ +config: + data_1: + param_1: 'param_1_value' + param_2: 'param_2_value' + param_3: 'param_3_value' + data_2: + param_1: 'param_1_value' + param_2: 'param_2_value' + param_3: 'param_3_value' \ No newline at end of file diff --git a/core/tests/testdata/InstanceTest/config.yml b/core/tests/testdata/InstanceTest/config.yml new file mode 100644 index 000000000..570a7f650 --- /dev/null +++ b/core/tests/testdata/InstanceTest/config.yml @@ -0,0 +1,20 @@ +app: + default_route: + action: "login" +server: + environment: 'develop' +storage: + mysql: + driver: 'pdo_mysql' + host: 'mariadb' + dbname: 'suitecrm_8_app' + user: 'root' + password: '' + io: 'both' +entity: + namespaces: + core/modules/Users/Config/orm: 'SuiteCRM\Core\Modules\Users\Entity' +modules: + enabled: + - Users + - Administration \ No newline at end of file diff --git a/core/tests/testdata/ModuleMapper/config.yml b/core/tests/testdata/ModuleMapper/config.yml new file mode 100644 index 000000000..570a7f650 --- /dev/null +++ b/core/tests/testdata/ModuleMapper/config.yml @@ -0,0 +1,20 @@ +app: + default_route: + action: "login" +server: + environment: 'develop' +storage: + mysql: + driver: 'pdo_mysql' + host: 'mariadb' + dbname: 'suitecrm_8_app' + user: 'root' + password: '' + io: 'both' +entity: + namespaces: + core/modules/Users/Config/orm: 'SuiteCRM\Core\Modules\Users\Entity' +modules: + enabled: + - Users + - Administration \ No newline at end of file diff --git a/core/tests/testdata/ModuleMapper/noenabledmodules.config.yml b/core/tests/testdata/ModuleMapper/noenabledmodules.config.yml new file mode 100644 index 000000000..3df56a9db --- /dev/null +++ b/core/tests/testdata/ModuleMapper/noenabledmodules.config.yml @@ -0,0 +1,13 @@ +server: + environment: 'develop' +storage: + mysql: + driver: 'pdo_mysql' + host: 'mariadb' + dbname: 'suitecrm_8_app' + user: 'root' + password: '' + io: 'both' +modules: + paths: + - /../../modules/ \ No newline at end of file diff --git a/core/tests/testdata/RouterTest/DefaultRouter/config.yml b/core/tests/testdata/RouterTest/DefaultRouter/config.yml new file mode 100644 index 000000000..570a7f650 --- /dev/null +++ b/core/tests/testdata/RouterTest/DefaultRouter/config.yml @@ -0,0 +1,20 @@ +app: + default_route: + action: "login" +server: + environment: 'develop' +storage: + mysql: + driver: 'pdo_mysql' + host: 'mariadb' + dbname: 'suitecrm_8_app' + user: 'root' + password: '' + io: 'both' +entity: + namespaces: + core/modules/Users/Config/orm: 'SuiteCRM\Core\Modules\Users\Entity' +modules: + enabled: + - Users + - Administration \ No newline at end of file diff --git a/core/tests/testdata/RouterTest/DefaultRouter/defaultaction.config.yml b/core/tests/testdata/RouterTest/DefaultRouter/defaultaction.config.yml new file mode 100644 index 000000000..570a7f650 --- /dev/null +++ b/core/tests/testdata/RouterTest/DefaultRouter/defaultaction.config.yml @@ -0,0 +1,20 @@ +app: + default_route: + action: "login" +server: + environment: 'develop' +storage: + mysql: + driver: 'pdo_mysql' + host: 'mariadb' + dbname: 'suitecrm_8_app' + user: 'root' + password: '' + io: 'both' +entity: + namespaces: + core/modules/Users/Config/orm: 'SuiteCRM\Core\Modules\Users\Entity' +modules: + enabled: + - Users + - Administration \ No newline at end of file diff --git a/core/tests/testdata/RouterTest/DefaultRouter/defaultcontroller.config.yml b/core/tests/testdata/RouterTest/DefaultRouter/defaultcontroller.config.yml new file mode 100644 index 000000000..33bde2a67 --- /dev/null +++ b/core/tests/testdata/RouterTest/DefaultRouter/defaultcontroller.config.yml @@ -0,0 +1,20 @@ +app: + default_route: + controller: "Oauth" +server: + environment: 'develop' +storage: + mysql: + driver: 'pdo_mysql' + host: 'mariadb' + dbname: 'suitecrm_8_app' + user: 'root' + password: '' + io: 'both' +entity: + namespaces: + core/modules/Users/Config/orm: 'SuiteCRM\Core\Modules\Users\Entity' +modules: + enabled: + - Users + - Administration \ No newline at end of file diff --git a/core/tests/testdata/RouterTest/DefaultRouter/defaultmodule.config.yml b/core/tests/testdata/RouterTest/DefaultRouter/defaultmodule.config.yml new file mode 100644 index 000000000..e151e8c3e --- /dev/null +++ b/core/tests/testdata/RouterTest/DefaultRouter/defaultmodule.config.yml @@ -0,0 +1,20 @@ +app: + default_route: + module: "Users" +server: + environment: 'develop' +storage: + mysql: + driver: 'pdo_mysql' + host: 'mariadb' + dbname: 'suitecrm_8_app' + user: 'root' + password: '' + io: 'both' +entity: + namespaces: + core/modules/Users/Config/orm: 'SuiteCRM\Core\Modules\Users\Entity' +modules: + enabled: + - Users + - Administration \ No newline at end of file diff --git a/core/tests/testdata/RouterTest/ModRewriteRouter/config.yml b/core/tests/testdata/RouterTest/ModRewriteRouter/config.yml new file mode 100644 index 000000000..5948e1a00 --- /dev/null +++ b/core/tests/testdata/RouterTest/ModRewriteRouter/config.yml @@ -0,0 +1,17 @@ +server: + environment: 'develop' +storage: + mysql: + driver: 'pdo_mysql' + host: 'mariadb' + dbname: 'suitecrm_8_app' + user: 'root' + password: '' + io: 'both' +entity: + namespaces: + core/modules/Users/Config/orm: 'SuiteCRM\Core\Modules\Users\Entity' +modules: + enabled: + - Users + - Administration \ No newline at end of file diff --git a/core/tests/testdata/RouterTest/ModRewriteRouter/defaultaction.config.yml b/core/tests/testdata/RouterTest/ModRewriteRouter/defaultaction.config.yml new file mode 100644 index 000000000..570a7f650 --- /dev/null +++ b/core/tests/testdata/RouterTest/ModRewriteRouter/defaultaction.config.yml @@ -0,0 +1,20 @@ +app: + default_route: + action: "login" +server: + environment: 'develop' +storage: + mysql: + driver: 'pdo_mysql' + host: 'mariadb' + dbname: 'suitecrm_8_app' + user: 'root' + password: '' + io: 'both' +entity: + namespaces: + core/modules/Users/Config/orm: 'SuiteCRM\Core\Modules\Users\Entity' +modules: + enabled: + - Users + - Administration \ No newline at end of file diff --git a/core/tests/testdata/RouterTest/ModRewriteRouter/defaultcontroller.config.yml b/core/tests/testdata/RouterTest/ModRewriteRouter/defaultcontroller.config.yml new file mode 100644 index 000000000..a86a8b8c1 --- /dev/null +++ b/core/tests/testdata/RouterTest/ModRewriteRouter/defaultcontroller.config.yml @@ -0,0 +1,21 @@ +app: + default_route: + controller: "Oauth" + action: "login" +server: + environment: 'develop' +storage: + mysql: + driver: 'pdo_mysql' + host: 'mariadb' + dbname: 'suitecrm_8_app' + user: 'root' + password: '' + io: 'both' +entity: + namespaces: + core/modules/Users/Config/orm: 'SuiteCRM\Core\Modules\Users\Entity' +modules: + enabled: + - Users + - Administration \ No newline at end of file diff --git a/core/tests/testdata/RouterTest/ModRewriteRouter/defaultmodule.config.yml b/core/tests/testdata/RouterTest/ModRewriteRouter/defaultmodule.config.yml new file mode 100644 index 000000000..e151e8c3e --- /dev/null +++ b/core/tests/testdata/RouterTest/ModRewriteRouter/defaultmodule.config.yml @@ -0,0 +1,20 @@ +app: + default_route: + module: "Users" +server: + environment: 'develop' +storage: + mysql: + driver: 'pdo_mysql' + host: 'mariadb' + dbname: 'suitecrm_8_app' + user: 'root' + password: '' + io: 'both' +entity: + namespaces: + core/modules/Users/Config/orm: 'SuiteCRM\Core\Modules\Users\Entity' +modules: + enabled: + - Users + - Administration \ No newline at end of file diff --git a/core/tests/unit/phpunit/base/Cli/CommandMapperTest.php b/core/tests/unit/phpunit/base/Cli/CommandMapperTest.php new file mode 100644 index 000000000..7576b450d --- /dev/null +++ b/core/tests/unit/phpunit/base/Cli/CommandMapperTest.php @@ -0,0 +1,78 @@ +file = new SuiteCRM\Core\Base\Helper\File\File(); + + $this->configParameters = new SuiteCRM\Core\Base\Config\Manager(); + } + + public function testCommandMapper(): void + { + $configPath = BASE_PATH . '/tests/testdata/CommandMapperTest/config.yml'; + + $this->commandMapper = new CommandMapper($this->file, $this->configParameters, $configPath); + + $this->assertInstanceOf('SuiteCRM\Core\Base\Cli\CommandMapper', $this->commandMapper); + } + + public function testCommandMapperWithoutConfig(): void + { + $this->expectException(Error::class); + + $configPath = ''; + + $this->commandMapper = new CommandMapper($this->file, $this->configParameters, $configPath); + } + + public function testGetAllCommands(): void + { + $configPath = BASE_PATH . '/tests/testdata/CommandMapperTest/config.yml'; + + $this->commandMapper = new CommandMapper($this->file, $this->configParameters, $configPath); + + $this->assertInstanceOf('SuiteCRM\Core\Base\Cli\CommandMapper', $this->commandMapper); + + $modules = $this->commandMapper->getAllCommands(); + + $this->assertTrue(true); + } + + public function testNoEnabledModulesWithinConfig(): void + { + $configPath = BASE_PATH . '/tests/testdata/CommandMapperTest/noenabledmodules.config.yml'; + + $this->commandMapper = new CommandMapper($this->file, $this->configParameters, $configPath); + + $this->assertInstanceOf('SuiteCRM\Core\Base\Cli\CommandMapper', $this->commandMapper); + + $modules = $this->commandMapper->getAllCommands(); + + $this->assertTrue(true); + } +} \ No newline at end of file diff --git a/core/tests/unit/phpunit/base/Cli/SuiteCommand.php b/core/tests/unit/phpunit/base/Cli/SuiteCommand.php new file mode 100644 index 000000000..31386f14e --- /dev/null +++ b/core/tests/unit/phpunit/base/Cli/SuiteCommand.php @@ -0,0 +1,13 @@ +assertTrue(true); + } +} \ No newline at end of file diff --git a/core/tests/unit/phpunit/base/Config/ConfigTest.php b/core/tests/unit/phpunit/base/Config/ConfigTest.php new file mode 100644 index 000000000..d86509a71 --- /dev/null +++ b/core/tests/unit/phpunit/base/Config/ConfigTest.php @@ -0,0 +1,92 @@ +loadFiles( + BASE_PATH . '/tests/testdata/ConfigTest/LoadSingle/config.yml' + ); + + $this->assertTrue(true); + } + + public function testLoadFileNotFound(): void + { + $this->expectException('Exception'); + $this->expectExceptionMessage('Config paths need to be set up correctly'); + + $configManager = new ConfigManager(); + + // Loading file that does not exist + $configParameters = $configManager->loadFiles( + realpath( + BASE_PATH . '/tests/testdata/ConfigTest/LoadFileNotFound/config.yml' + ) + ); + } + + public function testLoadEmpty(): void + { + $configManager = new ConfigManager(); + + $configParameters = $configManager->loadFiles( + realpath( + BASE_PATH . '/tests/testdata/ConfigTest/LoadEmpty/config.yml' + ) + ); + + $params = $configParameters->getAll(); + + $this->assertCount(0, $params); + } + + public function testLoadSingle(): void + { + $configManager = new ConfigManager(); + + $configParameters = $configManager->loadFiles( + realpath( + BASE_PATH . '/tests/testdata/ConfigTest/LoadSingle/config.yml' + ) + ); + + $this->assertInstanceOf('SuiteCRM\Core\Base\Config\ParameterCollection', $configParameters); + $this->assertTrue($configParameters->has('config.data_1')); + } + + public function testLoadMultiple(): void + { + $files = [ + realpath(BASE_PATH . '/tests/testdata/ConfigTest/LoadMultiple/config_1.yml'), + realpath(BASE_PATH . '/tests/testdata/ConfigTest/LoadMultiple/config_2.yml'), + realpath(BASE_PATH . '/tests/testdata/ConfigTest/LoadMultiple/config_3.yml') + ]; + + $configManager = new ConfigManager(); + + $configParameters = $configManager->loadFiles($files); + + $this->assertTrue($configParameters->has('config_1.data_1.param_1')); + $this->assertTrue($configParameters->has('config_2.data_2.param_1')); + $this->assertTrue($configParameters->has('config_3.data_1.param_3')); + } +} diff --git a/core/tests/unit/phpunit/base/Helper/DataCollectionTest.php b/core/tests/unit/phpunit/base/Helper/DataCollectionTest.php new file mode 100644 index 000000000..100a8acea --- /dev/null +++ b/core/tests/unit/phpunit/base/Helper/DataCollectionTest.php @@ -0,0 +1,146 @@ + 'value_1', + 'key_2' => 'value_2', + 'key_3' => [ + 'key_1' => 'value_1', + 'key_2' => 'value_2', + 'key_3' => 'value_3', + ], + 'key_4' => 'value_4', + 'key_5' => 'value_5', + 'key_6' => 'value_6', + 'key_7' => 'value_7', + 'key_8' => 'value_8', + ]; + + $collection = new Collection($data); + + $actual = $collection->getAll(); + + $expected = [ + 'key_1' => 'value_1', + 'key_2' => 'value_2', + 'key_3.key_1' => 'value_1', + 'key_3.key_2' => 'value_2', + 'key_3.key_3' => 'value_3', + 'key_3' => [ + 'key_1' => 'value_1', + 'key_2' => 'value_2', + 'key_3' => 'value_3' + ], + 'key_4' => 'value_4', + 'key_5' => 'value_5', + 'key_6' => 'value_6', + 'key_7' => 'value_7', + 'key_8' => 'value_8', + ]; + + $this->assertEquals($expected, $actual); + } + + public function testSetParamToCollection(): void + { + $data = [ + 'key_1' => [] + ]; + + $sub_data = [ + 'sub_1' => 'value_1', + 'sub_2' => 'value_2', + 'sub_3' => 'value_3' + ]; + + $collection = new Collection($data); + + $collection->set('key_1', $sub_data); + + $key_1 = $collection->get('key_1'); + + $this->assertEquals($sub_data, $key_1); + } + + public function testIsEmptyCollection(): void + { + $data_1 = [ + 'array_to_count' => [] + ]; + + $collection_1 = new Collection($data_1); + + $result_1 = $collection_1->isEmpty('array_to_count'); + + $this->assertTrue($result_1); + + $data_2 = [ + 'array_to_count' => [ + 'key_1' => 'value_1', + 'key_2' => 'value_2', + 'key_3' => 'value_3', + ] + ]; + + $collection_2 = new Collection($data_2); + + $result_2 = $collection_2->isEmpty('array_to_count'); + + $this->assertFalse($result_2); + } + + public function testGetParamFromCollection(): void + { + $data = [ + 'key_1' => 'value_1', + 'key_2' => 'value_2', + ]; + + $collection = new Collection($data); + + // Get a value from key + $value = $collection->get('key_1'); + $this->assertEquals('value_1', $value); + + // Test key not found + $value = $collection->get('key_3'); + $this->assertFalse($value); + } + + public function testCountCollection(): void + { + $data_1 = [ + 'array_to_count' => [ + 'key_1' => 'value_1', + 'key_2' => 'value_2', + 'key_3' => 'value_3' + ] + ]; + + $collection_1 = new Collection($data_1); + + $count_1 = $collection_1->count('array_to_count'); + + $this->assertEquals(3, $count_1); + + $data_2 = [ + 'key_1' => 'value_1', + 'key_2' => 'value_2', + ]; + + $collection_2 = new Collection($data_2); + + $count_2 = $collection_2->count(); + + $this->assertEquals(2, $count_2); + } +} diff --git a/core/tests/unit/phpunit/base/Helper/FileHelperTest.php b/core/tests/unit/phpunit/base/Helper/FileHelperTest.php new file mode 100644 index 000000000..8bb040ed5 --- /dev/null +++ b/core/tests/unit/phpunit/base/Helper/FileHelperTest.php @@ -0,0 +1,262 @@ +fileHelper = new FileHelper(); + + $startPath = __DIR__ . '/../../../../'; + + $folder1 = $startPath . 'testdata/FileHelperTest/Directories/Directory1'; + + $rFolder1 = realpath($folder1); + + if ($rFolder1 !== false) { + $this->fileHelper->deleteDirectory($rFolder1); + } + + if (mkdir($folder1, 0777, true)) { + $folder1SubDirectory1 = $folder1 . '/Directory1'; + $folder1SubDirectory2 = $folder1 . '/Directory2'; + $folder1SubDirectory3 = $folder1 . '/Directory3'; + + if (mkdir($folder1SubDirectory1, 0777, true)) { + $my_file = 'file.txt'; + $handle = fopen($folder1SubDirectory1 . '/' . $my_file, 'wb'); + $data = 'Test file'; + fwrite($handle, $data); + fclose($handle); + } + + if (mkdir($folder1SubDirectory2, 0777, true)) { + $my_file = 'file.txt'; + $handle = fopen($folder1SubDirectory2 . '/' . $my_file, 'wb'); + $data = 'Test file'; + fwrite($handle, $data); + fclose($handle); + } + + if (mkdir($folder1SubDirectory3, 0777, true)) { + $my_file = 'file.txt'; + $handle = fopen($folder1SubDirectory3 . '/' . $my_file, 'wb'); + $data = 'Test file'; + fwrite($handle, $data); + fclose($handle); + } + } + + $folder2 = $startPath . 'testdata/FileHelperTest/Directories/Directory2'; + + $rFolder2 = realpath($folder2); + + if ($rFolder2 !== false) { + $this->fileHelper->deleteDirectory($rFolder2); + } + + if (mkdir($folder2, 0777, true)) { + $folder2SubDirectory1 = $folder2 . '/Directory1'; + + if (mkdir($folder2SubDirectory1, 0777, true)) { + $my_file = 'file.txt'; + $handle = fopen($folder2SubDirectory1 . '/' . $my_file, 'wb'); + $data = 'Test file'; + fwrite($handle, $data); + fclose($handle); + } + } + + $folder3 = $startPath . 'testdata/FileHelperTest/Directories/Directory3'; + + $rFolder3 = realpath($folder3); + + if ($rFolder3 !== false) { + $this->fileHelper->deleteDirectory($rFolder3); + } + + if (mkdir($folder3, 0777, true)) { + $folder3SubDirectory1 = $folder3 . '/Directory1'; + + if (mkdir($folder3SubDirectory1, 0777, true)) { + $my_file = 'file.txt'; + $handle = fopen($folder3SubDirectory1 . '/' . $my_file, 'wb'); + $data = 'Test file'; + fwrite($handle, $data); + fclose($handle); + } + } + + $folder4 = $startPath . 'testdata/FileHelperTest/Directories/Directory4'; + + $rFolder4 = realpath($folder4); + + if ($rFolder4 !== false) { + $this->fileHelper->deleteDirectory($rFolder4); + } + + if (mkdir($folder4, 0777, true)) { + $folder4SubDirectory1 = $folder4 . '/Directory1'; + + if (mkdir($folder4SubDirectory1, 0777, true)) { + $my_file = 'file.txt'; + $handle = fopen($folder4SubDirectory1 . '/' . $my_file, 'wb'); + $data = 'Test file'; + fwrite($handle, $data); + fclose($handle); + } + } + } + + public function tearDown() + { + $startPath = __DIR__ . '/../../../../'; + + $rFolder1 = realpath($startPath . '/testdata/FileHelperTest/Directories/Directory1'); + + if ($rFolder1 !== false) { + $this->fileHelper->deleteDirectory($rFolder1); + } + + $rFolder2 = realpath($startPath . '/testdata/FileHelperTest/Directories/Directory2'); + + if ($rFolder2 !== false) { + $this->fileHelper->deleteDirectory($rFolder2); + } + + $rFolder3 = realpath($startPath . '/testdata/FileHelperTest/Directories/Directory3'); + + if ($rFolder3 !== false) { + $this->fileHelper->deleteDirectory($rFolder3); + } + + $rFolder4 = realpath($startPath . '/testdata/FileHelperTest/Directories/Directory4'); + + if ($rFolder4 !== false) { + $this->fileHelper->deleteDirectory($rFolder4); + } + } + + public function testFindDirectories(): void + { + $paths = [ + __DIR__ . '/../../../../testdata/FileHelperTest/Directories' + ]; + + $files = $this->fileHelper->findDirectories($paths); + + $this->assertCount(4, $files); + + $this->assertContains('Directory1', $files); + $this->assertContains('Directory2', $files); + $this->assertContains('Directory3', $files); + $this->assertContains('Directory4', $files); + } + + public function testRecursiveCopy(): void + { + $path = realpath(__DIR__ . '/../../../../testdata/FileHelperTest/Directories'); + + $this->assertNotFalse($path); + + $src = $path . '/Directory2'; + $dst = $path . '/Directory4/Directory2'; + + + $this->fileHelper->recurseCopy($src, $dst); + + $this->assertFileExists($path . '/Directory4/Directory2'); + } + + public function testRecursiveCopyNotFolder(): void + { + $this->expectException('RuntimeException'); + + $startPath = realpath(__DIR__ . '/../../../../'); + + $path = $startPath . '/testdata/FileHelperTest/Directories'; + + $src = $path . '/Directory2'; + + $dst = $path . '/Directory4/Directory1/file.txt'; + + $this->fileHelper->recurseCopy($src, $dst); + } + + public function testDeleteDirectories(): void + { + $startPath = __DIR__ . '/../../../../'; + + $parentFolder = realpath($startPath . '/testdata/FileHelperTest/Directories/Directory1'); + + $folderToDelete = realpath($parentFolder . '/Directory1'); + + $this->assertTrue($this->fileHelper->deleteDirectory($folderToDelete)); + $this->assertFalse(realpath($parentFolder . '/Directory1')); + } + + public function testDeleteDirectoryApartFrom(): void + { + $startPath = __DIR__ . '/../../../../'; + + $parentFolder = realpath($startPath . '/testdata/FileHelperTest/Directories/Directory1'); + + $folderToDelete = $parentFolder; + + $files = $this->fileHelper->findDirectories($parentFolder); + + $leaveFolders = [ + $parentFolder . '/Directory2' + ]; + + $this->assertCount(3, $files); + + $this->assertSame(['Directory1', 'Directory2', 'Directory3'], $files); + + $this->assertTrue($this->fileHelper->deleteDirectory($folderToDelete, $leaveFolders)); + + $files = $this->fileHelper->findDirectories($parentFolder); + + $this->assertSame(['Directory2'], $files); + + $folder2 = $startPath . '/testdata/FileHelperTest/Directories/Directory2'; + + $this->assertCount(1, $files); + } + + public function testFindFiles(): void + { + $startPath = realpath(__DIR__ . '/../../../../'); + + $path = $startPath . '/testdata/FileHelperTest/Directories'; + + $files = $this->fileHelper->findFiles((array)$path, '/(.*)(\/FileHelperTest\/Directories\/Directory3)/'); + + $this->assertCount(1, $files); + $this->assertEquals($files[0], $path . '/Directory3/Directory1/file.txt'); + } + + public function testFindFilesAsString(): void + { + $startPath = realpath(__DIR__ . '/../../../../'); + + $path = $startPath . '/testdata/FileHelperTest/Directories'; + + $files = $this->fileHelper->findFiles($path, '/(.*)(\/FileHelperTest\/Directories\/Directory3)/'); + + $this->assertCount(1, $files); + $this->assertEquals($files[0], $path . '/Directory3/Directory1/file.txt'); + } + +} diff --git a/core/tests/unit/phpunit/base/LoadInstanceTest.php b/core/tests/unit/phpunit/base/LoadInstanceTest.php new file mode 100644 index 000000000..541eef8f6 --- /dev/null +++ b/core/tests/unit/phpunit/base/LoadInstanceTest.php @@ -0,0 +1,120 @@ +loadFiles( + [ + BASE_PATH . '/tests/testdata/InstanceTest/config.yml' + ] + ); + + $moduleManager = new SuiteCRM\Core\Base\Module\Manager($configParameters, $fileHelper); + + $route = null; + $this->instance = new Instance($configParameters, $route, $moduleManager); + } + + public function setUp() + { + // Get the Application Path + + // Get the Base Path + if (!defined('BASE_PATH')) { + define('BASE_PATH', realpath(__DIR__ . '/../../../../')); + } + + // Get the Application Path + if (!defined('APP_PATH')) { + define('APP_PATH', BASE_PATH . '/modules'); + } + + $config = new SuiteCRM\Core\Base\Config\Manager(); + + $fileHelper = new SuiteCRM\Core\Base\Helper\File\File(); + + $configParameters = $config->loadFiles( + [ + BASE_PATH . '/tests/testdata/InstanceTest/config.yml' + ] + ); + + $route = new stdClass(); + + $moduleManager = new SuiteCRM\Core\Base\Module\Manager($configParameters, $fileHelper); + + // Set get variables + $_GET['module'] = 'Users'; + $_GET['controller'] = 'Oauth'; + $_GET['action'] = 'login'; + + $request = new SuiteCRM\Core\Base\Http\Request( + $_GET, + $_POST, + [], + $_COOKIE, + $_FILES, + $_SERVER + ); + + $router = new SuiteCRM\Core\Base\Route\DefaultRouter($request, $configParameters); + $route = $router->load(); + + $this->instance = new Instance($configParameters, $route, $moduleManager); + } + + public function testRunInstance(): void + { + $run = $this->instance->run(); + + $this->assertInstanceOf(Instance::class, $run); + } + + public function testGetAllRoutes(): void + { + $route = $this->instance->getAllRoutes(); + + $this->assertTrue(true); + } + + public function testGetRoute(): void + { + $route = $this->instance->getRoute(); + + $this->assertSame('Users', $route->module); + $this->assertSame('SuiteCRM\Core\Modules\Users\Controller\Oauth', $route->controller); + $this->assertSame('actionLogin', $route->action); + } + + public function testGetAllServices(): void + { + $services = $this->instance->getAllServices(); + + $this->assertTrue(true); + } + + public function testGetRouteButRoutesUndefined(): void + { + $this->expectException('Exception'); + $this->expectExceptionMessage('Route was not configured'); + + $this->unsetRoute(); + + $route = $this->instance->getRoute(); + } +} diff --git a/core/tests/unit/phpunit/base/Module/ModuleMapperTest.php b/core/tests/unit/phpunit/base/Module/ModuleMapperTest.php new file mode 100644 index 000000000..b98f01786 --- /dev/null +++ b/core/tests/unit/phpunit/base/Module/ModuleMapperTest.php @@ -0,0 +1,76 @@ +fileHelper = new SuiteCRM\Core\Base\Helper\File\File(); + } + + public function testCheckModulesExist(): void + { + $config = new ConfigManager(); + + $configParameters = $config->loadFiles( + [ + BASE_PATH . '/tests/testdata/ModuleMapper/config.yml' + ] + ); + + $filePaths = [ + __DIR__ . '/../../../../../modules' + ]; + + $moduleMapper = new ModuleMapper($filePaths, $this->fileHelper, $configParameters); + + $this->assertCount(1, count($moduleMapper->checkModulesExist(['Users']))); + } + + public function testGetModuleClassesFromFileName(): void + { + $config = new ConfigManager(); + + $configParameters = $config->loadFiles( + [ + BASE_PATH . '/tests/testdata/ModuleMapper/config.yml' + ] + ); + + $filePaths = [ + __DIR__ . '/../../../../../modules' + ]; + + $moduleMapper = new ModuleMapper($filePaths, $this->fileHelper, $configParameters); + + $moduleClasses = $moduleMapper->getModuleClassesFromFileName( + [ + realpath(__DIR__ . '/../../../../../modules/Users/Users.php') + ] + ); + + $this->assertInstanceOf('SuiteCRM\Core\Modules\Users\Users', $moduleClasses[0]); + } +} \ No newline at end of file diff --git a/core/tests/unit/phpunit/base/Router/DefaultRouterTest.php b/core/tests/unit/phpunit/base/Router/DefaultRouterTest.php new file mode 100644 index 000000000..b19881dfa --- /dev/null +++ b/core/tests/unit/phpunit/base/Router/DefaultRouterTest.php @@ -0,0 +1,260 @@ +fileHelper = new SuiteCRM\Core\Base\Helper\File\File(); + } + + public function testNoModule(): void + { + $this->expectException('Exception'); + $this->expectExceptionMessage('Default module has not been configured.'); + + $config = new SuiteCRM\Core\Base\Config\Manager(); + + $configParameters = $config->loadFiles( + [ + BASE_PATH . '/tests/testdata/RouterTest/DefaultRouter/config.yml' + ] + ); + + $route = new stdClass(); + + $this->assertInstanceOf('SuiteCRM\Core\Base\Helper\File\File', $this->fileHelper); + + $moduleManager = new SuiteCRM\Core\Base\Module\Manager($configParameters, $this->fileHelper); + + // Set get variables + $_GET['module'] = ''; + + $request = new SuiteCRM\Core\Base\Http\Request( + $_GET, + $_POST, + [], + $_COOKIE, + $_FILES, + $_SERVER + ); + + $router = new SuiteCRM\Core\Base\Route\DefaultRouter($request, $configParameters); + $route = $router->load(); + } + + public function testDefaultModule(): void + { + $config = new SuiteCRM\Core\Base\Config\Manager(); + + $fileHelper = new SuiteCRM\Core\Base\Helper\File\File(); + + $configParameters = $config->loadFiles( + [ + BASE_PATH . '/tests/testdata/RouterTest/DefaultRouter/defaultmodule.config.yml' + ] + ); + + $route = new stdClass(); + + $moduleManager = new SuiteCRM\Core\Base\Module\Manager($configParameters, $fileHelper); + + // Set get variables + $_GET['module'] = ''; + $_GET['controller'] = 'Oauth'; + $_GET['action'] = 'login'; + + $request = new SuiteCRM\Core\Base\Http\Request( + $_GET, + $_POST, + [], + $_COOKIE, + $_FILES, + $_SERVER + ); + + $router = new SuiteCRM\Core\Base\Route\DefaultRouter($request, $configParameters); + $route = $router->load(); + + $this->assertSame('Users', $route->module); + + $this->instance = new Instance($configParameters, $route, $moduleManager); + + $this->assertInstanceOf('SuiteCRM\Core\Base\Instance', $this->instance); + } + + public function testNoController(): void + { + $this->expectException('Exception'); + $this->expectExceptionMessage('Default controller has not been configured.'); + + $config = new SuiteCRM\Core\Base\Config\Manager(); + + $configParameters = $config->loadFiles( + [ + BASE_PATH . '/tests/testdata/RouterTest/DefaultRouter/config.yml' + ] + ); + + $route = new stdClass(); + + $this->assertInstanceOf('SuiteCRM\Core\Base\Helper\File\File', $this->fileHelper); + + $moduleManager = new SuiteCRM\Core\Base\Module\Manager($configParameters, $this->fileHelper); + + // Set get variables + $_GET['module'] = 'Users'; + $_GET['controller'] = ''; + + $request = new SuiteCRM\Core\Base\Http\Request( + $_GET, + $_POST, + [], + $_COOKIE, + $_FILES, + $_SERVER + ); + + $router = new SuiteCRM\Core\Base\Route\DefaultRouter($request, $configParameters); + $route = $router->load(); + } + + public function testDefaultController(): void + { + $config = new SuiteCRM\Core\Base\Config\Manager(); + + $fileHelper = new SuiteCRM\Core\Base\Helper\File\File(); + + $configParameters = $config->loadFiles( + [ + BASE_PATH . '/tests/testdata/RouterTest/DefaultRouter/defaultcontroller.config.yml' + ] + ); + + $route = new stdClass(); + + $moduleManager = new SuiteCRM\Core\Base\Module\Manager($configParameters, $fileHelper); + + // Set get variables + $_GET['module'] = 'Users'; + $_GET['controller'] = ''; + $_GET['action'] = 'login'; + + $request = new SuiteCRM\Core\Base\Http\Request( + $_GET, + $_POST, + [], + $_COOKIE, + $_FILES, + $_SERVER + ); + + $router = new SuiteCRM\Core\Base\Route\DefaultRouter($request, $configParameters); + $route = $router->load(); + + $this->assertSame('Users', $route->module); + + $this->instance = new Instance($configParameters, $route, $moduleManager); + + $this->assertInstanceOf('SuiteCRM\Core\Base\Instance', $this->instance); + } + + public function testNoAction(): void + { + $config = new SuiteCRM\Core\Base\Config\Manager(); + + $configParameters = $config->loadFiles( + [ + BASE_PATH . '/tests/testdata/RouterTest/DefaultRouter/config.yml' + ] + ); + + $route = new stdClass(); + + $this->assertInstanceOf('SuiteCRM\Core\Base\Helper\File\File', $this->fileHelper); + + $moduleManager = new SuiteCRM\Core\Base\Module\Manager($configParameters, $this->fileHelper); + + // Set get variables + $_GET['module'] = 'Users'; + $_GET['controller'] = 'Oauth'; + + $request = new SuiteCRM\Core\Base\Http\Request( + $_GET, + $_POST, + [], + $_COOKIE, + $_FILES, + $_SERVER + ); + + $router = new SuiteCRM\Core\Base\Route\DefaultRouter($request, $configParameters); + $route = $router->load(); + } + + public function testDefaultAction(): void + { + $config = new SuiteCRM\Core\Base\Config\Manager(); + + $fileHelper = new SuiteCRM\Core\Base\Helper\File\File(); + + $configParameters = $config->loadFiles( + [ + BASE_PATH . '/tests/testdata/RouterTest/DefaultRouter/defaultaction.config.yml' + ] + ); + + $route = new stdClass(); + + $moduleManager = new SuiteCRM\Core\Base\Module\Manager($configParameters, $fileHelper); + + // Set get variables + $_GET['module'] = 'Users'; + $_GET['controller'] = 'Oauth'; + $_GET['action'] = ''; + + $request = new SuiteCRM\Core\Base\Http\Request( + $_GET, + $_POST, + [], + $_COOKIE, + $_FILES, + $_SERVER + ); + + $router = new SuiteCRM\Core\Base\Route\DefaultRouter($request, $configParameters); + $route = $router->load(); + + $this->assertSame('Users', $route->module); + + $this->instance = new Instance($configParameters, $route, $moduleManager); + + $this->assertInstanceOf('SuiteCRM\Core\Base\Instance', $this->instance); + } + +} \ No newline at end of file diff --git a/core/tests/unit/phpunit/base/Router/ModRewriteRouterTest.php b/core/tests/unit/phpunit/base/Router/ModRewriteRouterTest.php new file mode 100644 index 000000000..25400aa05 --- /dev/null +++ b/core/tests/unit/phpunit/base/Router/ModRewriteRouterTest.php @@ -0,0 +1,278 @@ +fileHelper = new SuiteCRM\Core\Base\Helper\File\File(); + } + + + public function testNoAction(): void + { + $_GET['query_string'] = 'users/oauth'; + + $this->expectException('Exception'); + $this->expectExceptionMessage('Default action has not been configured.'); + + $config = new SuiteCRM\Core\Base\Config\Manager(); + + $configParameters = $config->loadFiles( + [ + BASE_PATH . '/tests/testdata/RouterTest/ModRewriteRouter/config.yml' + ] + ); + + $route = new stdClass(); + + $this->assertInstanceOf('SuiteCRM\Core\Base\Helper\File\File', $this->fileHelper); + + $moduleManager = new SuiteCRM\Core\Base\Module\Manager($configParameters, $this->fileHelper); + + // Set get variables + $_GET['module'] = 'Users'; + $_GET['controller'] = 'Oauth'; + + $request = new SuiteCRM\Core\Base\Http\Request( + $_GET, + $_POST, + [], + $_COOKIE, + $_FILES, + $_SERVER + ); + + $router = new SuiteCRM\Core\Base\Route\ModRewriteRouter($request, $configParameters); + $route = $router->load(); + } + + public function testDefaultAction(): void + { + $_GET['query_string'] = 'users/oauth'; + + $config = new SuiteCRM\Core\Base\Config\Manager(); + + $fileHelper = new SuiteCRM\Core\Base\Helper\File\File(); + + $configParameters = $config->loadFiles( + [ + BASE_PATH . '/tests/testdata/RouterTest/ModRewriteRouter/defaultaction.config.yml' + ] + ); + + $route = new stdClass(); + + $moduleManager = new SuiteCRM\Core\Base\Module\Manager($configParameters, $fileHelper); + + // Set get variables + $_GET['module'] = 'Users'; + $_GET['controller'] = 'Oauth'; + $_GET['action'] = ''; + + $request = new SuiteCRM\Core\Base\Http\Request( + $_GET, + $_POST, + [], + $_COOKIE, + $_FILES, + $_SERVER + ); + + $router = new SuiteCRM\Core\Base\Route\ModRewriteRouter($request, $configParameters); + $route = $router->load(); + + $this->assertSame('users', $route->module); + + $this->instance = new Instance($configParameters, $route, $moduleManager); + + $this->assertInstanceOf('SuiteCRM\Core\Base\Instance', $this->instance); + } + + public function testNoController(): void + { + $_GET['query_string'] = 'users/'; + + $this->expectException('Exception'); + $this->expectExceptionMessage('Default controller has not been configured.'); + + $config = new SuiteCRM\Core\Base\Config\Manager(); + + $configParameters = $config->loadFiles( + [ + BASE_PATH . '/tests/testdata/RouterTest/ModRewriteRouter/config.yml' + ] + ); + + $route = new stdClass(); + + $this->assertInstanceOf('SuiteCRM\Core\Base\Helper\File\File', $this->fileHelper); + + $moduleManager = new SuiteCRM\Core\Base\Module\Manager($configParameters, $this->fileHelper); + + // Set get variables + $_GET['module'] = 'Users'; + $_GET['controller'] = ''; + + $request = new SuiteCRM\Core\Base\Http\Request( + $_GET, + $_POST, + [], + $_COOKIE, + $_FILES, + $_SERVER + ); + + $router = new SuiteCRM\Core\Base\Route\ModRewriteRouter($request, $configParameters); + $route = $router->load(); + } + + public function testDefaultController(): void + { + $_GET['query_string'] = 'users/'; + + $config = new SuiteCRM\Core\Base\Config\Manager(); + + $fileHelper = new SuiteCRM\Core\Base\Helper\File\File(); + + $configParameters = $config->loadFiles( + [ + BASE_PATH . '/tests/testdata/RouterTest/ModRewriteRouter/defaultcontroller.config.yml' + ] + ); + + $route = new stdClass(); + + $moduleManager = new SuiteCRM\Core\Base\Module\Manager($configParameters, $fileHelper); + + // Set get variables + $_GET['module'] = 'Users'; + $_GET['controller'] = ''; + $_GET['action'] = 'login'; + + $request = new SuiteCRM\Core\Base\Http\Request( + $_GET, + $_POST, + [], + $_COOKIE, + $_FILES, + $_SERVER + ); + + $router = new SuiteCRM\Core\Base\Route\ModRewriteRouter($request, $configParameters); + $route = $router->load(); + + $this->assertSame('users', $route->module); + + $this->instance = new Instance($configParameters, $route, $moduleManager); + + $this->assertInstanceOf('SuiteCRM\Core\Base\Instance', $this->instance); + } + + public function testNoModule(): void + { + $_GET['query_string'] = ''; + + $this->expectException('Exception'); + $this->expectExceptionMessage('Default module has not been configured.'); + + $config = new SuiteCRM\Core\Base\Config\Manager(); + + $configParameters = $config->loadFiles( + [ + BASE_PATH . '/tests/testdata/RouterTest/ModRewriteRouter/config.yml' + ] + ); + + $route = new stdClass(); + + $this->assertInstanceOf('SuiteCRM\Core\Base\Helper\File\File', $this->fileHelper); + + $moduleManager = new SuiteCRM\Core\Base\Module\Manager($configParameters, $this->fileHelper); + + // Set get variables + $_GET['module'] = ''; + + $request = new SuiteCRM\Core\Base\Http\Request( + $_GET, + $_POST, + [], + $_COOKIE, + $_FILES, + $_SERVER + ); + + $router = new SuiteCRM\Core\Base\Route\ModRewriteRouter($request, $configParameters); + $route = $router->load(); + } + + public function testDefaultModule(): void + { + $_GET['query_string'] = ''; + + $this->expectException('Exception'); + $this->expectExceptionMessage('Default controller has not been configured.'); + + $config = new SuiteCRM\Core\Base\Config\Manager(); + + $fileHelper = new SuiteCRM\Core\Base\Helper\File\File(); + + $configParameters = $config->loadFiles( + [ + BASE_PATH . '/tests/testdata/RouterTest/ModRewriteRouter/defaultmodule.config.yml' + ] + ); + + $route = new stdClass(); + + $moduleManager = new SuiteCRM\Core\Base\Module\Manager($configParameters, $fileHelper); + + // Set get variables + $_GET['module'] = ''; + $_GET['controller'] = 'Oauth'; + $_GET['action'] = 'login'; + + $request = new SuiteCRM\Core\Base\Http\Request( + $_GET, + $_POST, + [], + $_COOKIE, + $_FILES, + $_SERVER + ); + + $router = new SuiteCRM\Core\Base\Route\ModRewriteRouter($request, $configParameters); + $route = $router->load(); + + $this->assertSame('users', $route->module); + + $this->instance = new Instance($configParameters, $route, $moduleManager); + + $this->assertInstanceOf('SuiteCRM\Core\Base\Instance', $this->instance); + } +} \ No newline at end of file diff --git a/core/tests/unit/phpunit/legacy/AuthenticationServiceTest.php b/core/tests/unit/phpunit/legacy/AuthenticationServiceTest.php new file mode 100644 index 000000000..0011ad9e4 --- /dev/null +++ b/core/tests/unit/phpunit/legacy/AuthenticationServiceTest.php @@ -0,0 +1,40 @@ +authenticationService = new AuthenticationService(); + } + + public function testGetName(): void + { + $this->assertSame('users.authentication', $this->authenticationService->getName()); + } + + public function testGetDescription(): void + { + $this->assertSame( + 'This service will deal with legacy authentication', + $this->authenticationService->getDescription() + ); + } + + public function testCreateService(): void + { + $this->assertInstanceOf(Authentication::class, $this->authenticationService->createService()); + } +} + + + diff --git a/core/tests/unit/phpunit/legacy/AuthenticationTest.php b/core/tests/unit/phpunit/legacy/AuthenticationTest.php new file mode 100644 index 000000000..e69de29bb diff --git a/extentions/.gitkeep b/extentions/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/index.php b/index.php new file mode 100755 index 000000000..cb6c758b2 --- /dev/null +++ b/index.php @@ -0,0 +1,79 @@ +loadFiles( + [ + BASE_PATH . '/config/config.yml', + BASE_PATH . '/core/base/Config/modules.config.yml', + BASE_PATH . '/core/base/Config/services.config.yml', + ] + ); +} catch (Exception $e) { + trigger_error('Config failed to load files: ' . $e); +} + +$request = new SuiteCRM\Core\Base\Http\Request( + $_GET, + $_POST, + [], + $_COOKIE, + $_FILES, + $_SERVER +); + +$response = new SuiteCRM\Core\Base\Http\Response(); +$fileHelper = new SuiteCRM\Core\Base\Helper\File\File(); + +$moduleManager = new SuiteCRM\Core\Base\Module\Manager($configParameters, $fileHelper); +$router = new SuiteCRM\Core\Base\Route\DefaultRouter($request, $configParameters); +try { + $route = $router->load(); +} catch (Exception $e) { + trigger_error('Router failed to load: ' . $e); +} + +// Create an Instance of SuiteCRM +$instance = new SuiteCRM\Core\Base\Instance($configParameters, $route, $moduleManager); + +// Run the Application +$route = $instance->run()->getRoute(); + +$view = new SuiteCRM\Core\Base\Module\View\Handler(); + +$serviceMapper = new SuiteCRM\Core\Base\Module\Service\ServiceMapper($fileHelper, $moduleManager, $configParameters); + +$services = $serviceMapper->getAllServices(); + +$controller = new $route->controller($configParameters, $request, $response, $view, $services); + +$customController = 'Custom\\' . $route->controller; + +// Check the custom +if (class_exists($customController)) { + $controller = new $customController(); +} + +$params = []; + +call_user_func_array([$controller, $route->action], $params); diff --git a/logs/.gitkeep b/logs/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/public/.gitkeep b/public/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/robots.txt b/robots.txt new file mode 100755 index 000000000..3b5afa4e8 --- /dev/null +++ b/robots.txt @@ -0,0 +1,5 @@ +User-agent: * +Disallow: / + +User-agent: Googlebot +Allow: /ical_server.php