├── .github └── ISSUE_TEMPLATE │ ├── bug_report.md │ └── feature_request.md ├── .gitignore ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── LICENSE ├── PULL_REQUEST_TEMPLATE.md ├── README.md ├── app.js ├── bin └── www ├── client ├── .gitignore ├── README.md ├── babel.config.js ├── package-lock.json ├── package.json ├── postcss.config.js ├── public │ ├── favicon.ico │ └── index.html ├── src │ ├── App.vue │ ├── assets │ │ ├── logo.png │ │ └── styles │ │ │ └── index.css │ ├── components │ │ ├── ChatWindow.vue │ │ ├── ChatWindowEvents.vue │ │ ├── ChatWindowFooter.vue │ │ ├── ChatWindowHeader.vue │ │ ├── Error.vue │ │ ├── Loading.vue │ │ └── Vonage.vue │ ├── main.js │ └── services │ │ ├── Api.js │ │ ├── Server.js │ │ └── User.js └── vue.config.js ├── controllers ├── server.js └── user.js ├── package-lock.json ├── package.json ├── public ├── index.html └── stylesheets │ └── style.css ├── routes ├── server.js └── user.js └── vonage_logo.png /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | --- 8 | 9 | **Describe the bug** 10 | A clear and concise description of what the bug is. 11 | 12 | **To Reproduce** 13 | Steps to reproduce the behavior: 14 | 1. Go to '...' 15 | 2. Click on '....' 16 | 3. Scroll down to '....' 17 | 4. See error 18 | 19 | **Expected behavior** 20 | A clear and concise description of what you expected to happen. 21 | 22 | **Screenshots** 23 | If applicable, add screenshots to help explain your problem. 24 | 25 | **Desktop (please complete the following information):** 26 | - OS: [e.g. iOS] 27 | - Browser [e.g. chrome, safari] 28 | - Version [e.g. 22] 29 | 30 | **Smartphone (please complete the following information):** 31 | - Device: [e.g. iPhone6] 32 | - OS: [e.g. iOS8.1] 33 | - Browser [e.g. stock browser, safari] 34 | - Version [e.g. 22] 35 | 36 | **Additional context** 37 | Add any other context about the problem here. 38 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | --- 8 | 9 | **Is your feature request related to a problem? Please describe.** 10 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 11 | 12 | **Describe the solution you'd like** 13 | A clear and concise description of what you want to happen. 14 | 15 | **Describe alternatives you've considered** 16 | A clear and concise description of any alternative solutions or features you've considered. 17 | 18 | **Additional context** 19 | Add any other context or screenshots about the feature request here. 20 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Runtime data 9 | pids 10 | *.pid 11 | *.seed 12 | *.pid.lock 13 | 14 | # Directory for instrumented libs generated by jscoverage/JSCover 15 | lib-cov 16 | 17 | # Coverage directory used by tools like istanbul 18 | coverage 19 | 20 | # nyc test coverage 21 | .nyc_output 22 | 23 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 24 | .grunt 25 | 26 | # Bower dependency directory (https://bower.io/) 27 | bower_components 28 | 29 | # node-waf configuration 30 | .lock-wscript 31 | 32 | # Compiled binary addons (https://nodejs.org/api/addons.html) 33 | build/Release 34 | 35 | # Dependency directories 36 | node_modules/ 37 | jspm_packages/ 38 | 39 | # Typescript v1 declaration files 40 | typings/ 41 | 42 | # Optional npm cache directory 43 | .npm 44 | 45 | # Optional eslint cache 46 | .eslintcache 47 | 48 | # Optional REPL history 49 | .node_repl_history 50 | 51 | # Output of 'npm pack' 52 | *.tgz 53 | 54 | # Yarn Integrity file 55 | .yarn-integrity 56 | 57 | # dotenv environment variables file 58 | .env 59 | 60 | # next.js build output 61 | .next 62 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | In the interest of fostering an open and welcoming environment, we as 6 | contributors and maintainers pledge to making participation in our project and 7 | our community a harassment-free experience for everyone, regardless of age, body 8 | size, disability, ethnicity, sex characteristics, gender identity and expression, 9 | level of experience, education, socio-economic status, nationality, personal 10 | appearance, race, religion, or sexual identity and orientation. 11 | 12 | ## Our Standards 13 | 14 | Examples of behavior that contributes to creating a positive environment 15 | include: 16 | 17 | * Using welcoming and inclusive language 18 | * Being respectful of differing viewpoints and experiences 19 | * Gracefully accepting constructive criticism 20 | * Focusing on what is best for the community 21 | * Showing empathy towards other community members 22 | 23 | Examples of unacceptable behavior by participants include: 24 | 25 | * The use of sexualized language or imagery and unwelcome sexual attention or 26 | advances 27 | * Trolling, insulting/derogatory comments, and personal or political attacks 28 | * Public or private harassment 29 | * Publishing others' private information, such as a physical or electronic 30 | address, without explicit permission 31 | * Other conduct which could reasonably be considered inappropriate in a 32 | professional setting 33 | 34 | ## Our Responsibilities 35 | 36 | Project maintainers are responsible for clarifying the standards of acceptable 37 | behavior and are expected to take appropriate and fair corrective action in 38 | response to any instances of unacceptable behavior. 39 | 40 | Project maintainers have the right and responsibility to remove, edit, or 41 | reject comments, commits, code, wiki edits, issues, and other contributions 42 | that are not aligned to this Code of Conduct, or to ban temporarily or 43 | permanently any contributor for other behaviors that they deem inappropriate, 44 | threatening, offensive, or harmful. 45 | 46 | ## Scope 47 | 48 | This Code of Conduct applies both within project spaces and in public spaces 49 | when an individual is representing the project or its community. Examples of 50 | representing a project or community include using an official project e-mail 51 | address, posting via an official social media account, or acting as an appointed 52 | representative at an online or offline event. Representation of a project may be 53 | further defined and clarified by project maintainers. 54 | 55 | ## Enforcement 56 | 57 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 58 | reported by contacting the project team at [devrel@vonage.com][devrel]. All 59 | complaints will be reviewed and investigated and will result in a response that 60 | is deemed necessary and appropriate to the circumstances. The project team is 61 | obligated to maintain confidentiality with regard to the reporter of an incident. 62 | Further details of specific enforcement policies may be posted separately. 63 | 64 | Project maintainers who do not follow or enforce the Code of Conduct in good 65 | faith may face temporary or permanent repercussions as determined by other 66 | members of the project's leadership. 67 | 68 | ## Attribution 69 | 70 | This Code of Conduct is adapted from the [Contributor Covenant][cchomepage], version 1.4, 71 | available at [https://www.contributor-covenant.org/version/1/4/code-of-conduct.html][cccoc] 72 | 73 | For answers to common questions about this code of conduct, see 74 | [https://www.contributor-covenant.org/faq][ccfaq] 75 | 76 | [cccoc]: https://www.contributor-covenant.org/version/1/4/code-of-conduct.html "Contributor Covenant CoC" 77 | [cchomepage]: https://www.contributor-covenant.org "Contributor Covenant" 78 | [ccfaq]: https://www.contributor-covenant.org/faq "Contributor Covenant FAQ" 79 | 80 | [devrel]: devrel@vonage.com "DevRel at Vonage dot com" -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing Guidelines 2 | 3 | :+1::tada: We :heart: contributions from everyone! :tada::+1: 4 | 5 | It is a good idea to [talk to us][slack] first if you plan to add any new functionality. Otherwise, [bug reports][issues], [bug fixes][pulls] and feedback on the library is always appreciated. Check out the [Contributing Guidelines][contributing] for more information and please follow the [GitHub Flow][githubflow]. 6 | 7 | [![contributions welcome][contribadge]][issues] 8 | 9 | The following is a set of guidelines for contributing to this project, which are hosted on GitHub. These are mostly guidelines, not rules. Use your best judgment, and feel free to propose changes to this document in a pull request. 10 | 11 | Please take the time to review the [Code of Conduct][coc], which all contributors are subject to on this project. 12 | 13 | [I don't want to read this whole thing, I just have a question!!!](#i-dont-want-to-read-this-whole-thing-i-just-have-a-question) 14 | 15 | **Table of Contents** 16 | 17 | - [Reporting Bugs](#reporting-bugs) 18 | - [Before Submitting A Bug Report](#before-submitting-a-bug-report) 19 | - [How Do I Submit A (Good) Bug Report?](#how-do-i-submit-a-good-bug-report) 20 | - [Suggesting Enhancements](#suggesting-enhancements) 21 | - [Before Submitting An Enhancement Suggestion](#before-submitting-an-enhancement-suggestion) 22 | - [How Do I Submit A (Good) Enhancement Suggestion?](#how-do-i-submit-a-good-enhancement-suggestion) 23 | - [Your First Code Contribution](#your-first-code-contribution) 24 | - [Pull Requests](#pull-requests) 25 | 26 | ## Reporting Bugs 27 | 28 | This section guides you through submitting a bug report. Following these guidelines helps maintainers and the community understand your report :pencil:, reproduce the behavior :computer: :computer:, and find related reports :mag_right:. 29 | 30 | Before creating bug reports, please check [this list](#before-submitting-a-bug-report) as you might find out that you don't need to create one. When you are creating a bug report, please [include as many details as possible](#how-do-i-submit-a-good-bug-report). Fill out [the required template][bugreport], the information it asks for helps us resolve issues faster. 31 | 32 | > **Note:** If you find a **Closed** issue that seems like it is the same thing that you're experiencing, open a new issue and include a link to the original issue in the body of your new one. 33 | 34 | ### Before Submitting A Bug Report 35 | 36 | * **Perform a cursory search** to see if the problem has already been reported. If it has **and the issue is still open**, add a comment to the existing issue instead of opening a new one. 37 | 38 | ### How Do I Submit A (Good) Bug Report? 39 | 40 | Bugs are tracked as [GitHub issues][githubissues]. Create an issue and provide the following information by filling in [the template][bugreport]. 41 | 42 | Explain the problem and include additional details to help maintainers reproduce the problem: 43 | 44 | * **Use a clear and descriptive title** for the issue to identify the problem. 45 | * **Describe the exact steps which reproduce the problem** in as many details as possible. For example, start by explaining how you started. When listing steps, **don't just say what you did, but explain how you did it**. 46 | * **Provide specific examples to demonstrate the steps**. Include links to files or copy/pasteable snippets, which you use in those examples. If you're providing snippets in the issue, use [Markdown code blocks][githubcodeblocks]. 47 | * **Describe the behavior you observed after following the steps** and point out what exactly is the problem with that behavior. 48 | * **Explain which behavior you expected to see instead and why.** 49 | * **Include screenshots and animated GIFs** where possible. Show how you follow the described steps and clearly demonstrate the problem. You can use [this tool][licecap] to record GIFs on macOS and Windows, and [this tool][silentcast] on Linux. 50 | * **If the problem wasn't triggered by a specific action**, describe what you were doing before the problem happened and share more information using the guidelines below. 51 | * **Can you reliably reproduce the issue?** If not, provide details about how often the problem happens and under which conditions it normally happens. 52 | Include details about your configuration and environment: 53 | 54 | ## Suggesting Enhancements 55 | 56 | This section guides you through submitting a suggestion, including completely new features and minor improvements to existing functionality. Following these guidelines helps maintainers and the community understand your suggestion :pencil: and find related suggestions :mag_right:. 57 | 58 | Before creating enhancement suggestions, please check [this list](#before-submitting-an-enhancement-suggestion) as you might find out that you don't need to create one. When you are creating an enhancement suggestion, please [include as many details as possible](#how-do-i-submit-a-good-enhancement-suggestion). Fill out [the required template][featurerequest], the information it asks for helps us resolve issues faster. 59 | 60 | ### Before Submitting An Enhancement Suggestion 61 | 62 | * **Perform a cursory search** to see if the enhancement has already been suggested. If it has, add a comment to the existing issue instead of opening a new one. 63 | 64 | ### How Do I Submit A (Good) Enhancement Suggestion? 65 | 66 | Enhancement suggestions are tracked as [GitHub issues][githubissues]. Create an issue and provide the following information by filling in [the template][featurerequest]. 67 | 68 | * **Use a clear and descriptive title** for the issue to identify the suggestion. 69 | * **Provide a step-by-step description of the suggested enhancement** in as many details as possible. 70 | * **Provide specific examples to demonstrate the steps**. Include copy/pasteable snippets which you use in those examples, as [Markdown code blocks][githubcodeblocks]. 71 | * **Describe the current behavior** and **explain which behavior you expected to see instead** and why. 72 | * **Explain why this enhancement would be useful** to most users. 73 | 74 | ## Your First Code Contribution 75 | 76 | Unsure where to begin contributing? You can start by looking through these `beginner` and `help-wanted` issues: 77 | 78 | * [Beginner issues][beginner] - issues which should only require a few lines of code, and a test or two. 79 | * [Help wanted issues][help-wanted] - issues which should be a bit more involved than `beginner` issues. 80 | 81 | Both issue lists are sorted by total number of comments. While not perfect, number of comments is a reasonable proxy for impact a given change will have. 82 | 83 | ## Pull Requests 84 | 85 | Please follow these steps to have your contribution considered by the maintainers: 86 | 87 | 1. Follow all instructions in [the template][pullrequest] 88 | 2. Adhear the [Code of Conduct][coc] 89 | 3. After you submit your pull request, verify that all [status checks][githubstatuschecks] are passing. 90 | 91 | While the prerequisites above must be satisfied prior to having your pull request reviewed, the reviewer(s) may ask you to complete additional design work, tests, or other changes before your pull request can be ultimately accepted. 92 | 93 | # I don't want to read this whole thing I just have a question!!! 94 | 95 | You can join the Vonage Community Slack for any questions you might have: 96 | 97 | * [Contact our Developer Relations Team][community] 98 | * [Reach out on Twitter][twitter] 99 | * This Twitter is monitored by our Developer Relations team, but not 24/7 — please be patient! 100 | * [Join the Vonage Community Slack][slack] 101 | * Even though Slack is a chat service, sometimes it takes several hours for community members to respond — please be patient! 102 | * Use the `#general` channel for general questions or discussion 103 | * Use the `#status` channel for receiving updates on our service status 104 | * There are many other channels available, check the channel list for channels for a specific library 105 | 106 | Alternatively, you can raise an issue on the project. 107 | 108 | [beginner]:https://github.com/search?utf8=%E2%9C%93&q=is%3Aopen+is%3Aissue+label%3Abeginner+label%3Ahelp-wanted+user%3Anexmo-community+sort%3Acomments-desc 109 | [help-wanted]:https://github.com/search?q=is%3Aopen+is%3Aissue+label%3Ahelp-wanted+user%3Anexmo-community+sort%3Acomments-desc+-label%3Abeginner 110 | 111 | [contribadge]: https://img.shields.io/badge/contributions-welcome-brightgreen.svg?style=flat "Contributions Welcome" 112 | 113 | [coc]: CODE_OF_CONDUCT.md "Code of Conduct" 114 | [contributing]: CONTRIBUTING.md "Contributing" 115 | [license]: LICENSE "MIT License" 116 | [pullrequest]: PULL_REQUEST_TEMPLATE.md "Pull Request template" 117 | 118 | [community]: https://developer.nexmo.com/community "Vonage Community" 119 | [signup]: https://dashboard.nexmo.com/sign-up?utm_source=DEV_REL&utm_medium=github&utm_campaign=lukeocodes 120 | [slack]: https://developer.nexmo.com/community/slack "Vonage Community Slack" 121 | [twitter]: https://twitter.com/VonageDev "VonageDev on Twitter" 122 | 123 | [bugreport]: ./../../issues/new?assignees=&labels=&template=bug_report.md&title= "Bug Report Template" 124 | [featurerequest]: ./../../issues/new?assignees=&labels=&template=feature_request.md&title= "Enhancement Suggestion Template" 125 | [issues]: ./../../issues "Issues" 126 | [pulls]: ./../../pulls "Pull requests" 127 | 128 | [githubcodeblocks]: https://help.github.com/articles/markdown-basics/#multiple-lines "GitHub Markdown Code Blocks" 129 | [githubflow]: https://guides.github.com/introduction/flow/index.html "GitHub Flow" 130 | [githubstatuschecks]: https://help.github.com/articles/about-status-checks/ "GitHub Status Checks" 131 | [licecap]: https://www.cockos.com/licecap/ "LICEcap: animated screen captures" 132 | [silentcast]: https://github.com/colinkeenan/silentcast "Silentcast: silent mkv screencasts and animated gifs" -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Vonage 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | * **Please check if the PR fulfills these requirements** 2 | - [ ] You've followed the [contributing guidelines][contributing] 3 | - [ ] You've adheared the [code of conduct][coc] 4 | 5 | * **What kind of change does this PR introduce?** (Bug fix, feature, docs update, ...) 6 | 7 | 8 | 9 | * **What is the current behavior?** (You can also link to an open issue here) 10 | 11 | 12 | 13 | * **What is the new behavior (if this is a feature change)?** 14 | 15 | 16 | 17 | * **Does this PR introduce a breaking change?** (What changes might users need to make in their application due to this PR?) 18 | 19 | 20 | 21 | * **Other information**: 22 | 23 | [coc]: CODE_OF_CONDUCT.md "Code of Conduct" 24 | [contributing]: CONTRIBUTING.md "Contributing" -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![Vonage][logo] 2 | 3 | # Building a Slack Clone Using Vue.js 4 | 5 | Have you ever wanted to build a chat application, but get stuck on features to add, or just how to build it generally? This repository supports a blog post on building a clone of everyone's favourite chat software, Slack. Using Vue.js, everyone's favourite framework. And, Vonage Conversation API, everyone's favourite conversation service. 6 | 7 | **Table of Contents** 8 | 9 | - [Getting Started](#getting-started) 10 | - [Node & NPM](#node--npm) 11 | - [Our CLI](#our-cli) 12 | - [Git (Optional)](#git-optional) 13 | - [This Demo Application](#this-demo-application) 14 | - [Configure the Application](#configure-the-application) 15 | - [Create an Application](#create-an-application) 16 | - [Create a Conversation](#create-a-conversation) 17 | - [Create Your User](#create-your-user) 18 | - [Add the User to a Conversation](#add-the-user-to-a-conversation) 19 | - [Generate a User Token](#generate-a-user-token) 20 | - [Store the Credentials in the Environment](#store-the-credentials-in-the-environment) 21 | - [Start the App Locally](#start-the-app-locally) 22 | - [Code of Conduct](#code-of-conduct) 23 | - [Contributing](#contributing) 24 | - [License](#license) 25 | 26 | ## Getting Started 27 | 28 | ### Node & NPM 29 | 30 | ```bash 31 | node --version 32 | npm --version 33 | ``` 34 | 35 | > Both Node and NPM need to be installed and at the correct version. [Go to nodejs.org](https://nodejs.org/), download and install the correct version if you don't have it. 36 | 37 | ### Our CLI 38 | 39 | To set up your application, you'll need to install [our CLI](https://www.npmjs.com/package/nexmo-cli). Install it using NPM in the terminal. 40 | 41 | ```bash 42 | npm install -g nexmo-cli@beta 43 | ``` 44 | 45 | You can check you have the right version with this command. At the time of writing, I was using version `0.4.9-beta-3`. 46 | 47 | ```bash 48 | nexmo --version 49 | ``` 50 | 51 | Remember to [sign up for a free Vonage account](https://dashboard.nexmo.com/sign-up) and configure the CLI with the API key and secret found on your dashboard. 52 | 53 | ```bash 54 | nexmo setup 55 | ``` 56 | 57 | ### Git (Optional) 58 | 59 | You can use git to clone the [demo application](https://github.com/nexmo-community/vuejs-slack-clone) from GitHub. 60 | 61 | > For those uncomfortable with git commands, don't worry, I've you covered. 62 | 63 | Follow this [guide to install git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git). 64 | 65 | ### This Demo Application 66 | 67 | Clone or download the demo application. To download, [go to the repository](https://github.com/nexmo-community/vuejs-slack-clone) and click on the *Clone or download* button on GitHub. 68 | 69 | > ***Note:*** If you download, make sure you're on the right version number before downloading. 70 | 71 | ```bash 72 | git clone https://github.com/nexmo-community/vuejs-slack-clone.git 73 | ``` 74 | 75 | Once unzipped or cloned, change into the directory. 76 | 77 | ```bash 78 | cd vuejs-slack-clone 79 | ``` 80 | 81 | If you cloned the repository, checkout the version you want to set up. 82 | 83 | ```bash 84 | git checkout part-1 85 | ``` 86 | 87 | Then, use npm to install the dependencies for the server and client apps. 88 | 89 | ```bash 90 | npm install && npm install -C client/ 91 | ``` 92 | 93 | ### Configure the Application 94 | 95 | Using our CLI, set up the service and configure the app with credentials to begin. 96 | 97 | #### Create an Application 98 | 99 | Create an application with RTC (real-time communication) capabilities. The event URL receives a live log of events happening on the service, like users joining/leaving, sending messages. It's an example URL for the moment. 100 | 101 | ```bash 102 | nexmo app:create "Vue.js Slack Chat" --capabilities=rtc --rtc-event-url=http://example.com --keyfile=private.key 103 | # Application created: 4556dbae-bf...f6e33350d8 104 | # Credentials written to .nexmo-app 105 | # Private Key saved to: private.key 106 | ``` 107 | 108 | #### Create a Conversation 109 | 110 | Secondly, create a conversation, which acts like a chatroom. Or, a container for messages and events. 111 | 112 | ```bash 113 | nexmo conversation:create display_name="general" 114 | # Conversation created: CON-a57b0...11e57f56d 115 | ``` 116 | 117 | #### Create Your User 118 | 119 | Now, create a user for yourself. 120 | 121 | ```bash 122 | nexmo user:create name=USER_NAME display_name=DISPLAY_NAME 123 | # User created: USR-6eaa4...e36b8a47f 124 | ``` 125 | 126 | #### Add the User to a Conversation 127 | 128 | Next, add your new user to the conversation. A user can be a member of an application, but they still need to join the conversation. 129 | 130 | ```bash 131 | nexmo member:add CONVERSATION_ID action=join channel='{"type":"app"}' user_id=USER_ID 132 | # Member added: MEM-df772...1ad7fa06 133 | ``` 134 | 135 | #### Generate a User Token 136 | 137 | Lastly, generate your new user a token. This token represents the user when accessing the application. This access token identifies them, so anyone using it will be assumed to be the correct user. 138 | 139 | In practice, you'll configure the application with this token. In production, these should be guarded, kept secret and very carefully exposed to the client application, if at all. 140 | 141 | The token is only usable for 24 hours. After that, you will need to re-run this `nexmo jwt:generate` command again to grant access to your client user again. 142 | 143 | ```bash 144 | nexmo jwt:generate ./private.key sub=USER_NAME exp=$(($(date +%s)+86400)) acl='{"paths":{"/*/users/**":{},"/*/conversations/**":{},"/*/sessions/**":{},"/*/devices/**":{},"/*/image/**":{},"/*/media/**":{},"/*/applications/**":{},"/*/push/**":{},"/*/knocking/**":{}}}' application_id=APPLICATION_ID 145 | # eyJhbGciOi...XVCJ9.eyJpYXQiOjE1NzM5M...In0.qn7J6...efWBpemaCDC7HtqA 146 | ``` 147 | 148 | ### Store the Credentials in the Environment 149 | 150 | Now, create a `.env` file and add the credentials you've now generated. 151 | 152 | ```bash 153 | # server config 154 | PORT=3000 155 | 156 | # user config 157 | VONAGE_USER=username 158 | # USER_NAME from the above commands 159 | VONAGE_USER_TOKEN=eyJhbGciOi...XVCJ9.eyJpYXQiOjE1NzM5M...In0.qn7J6...efWBpemaCDC7HtqA 160 | # as generated from `nexmo jwt:generate` 161 | 162 | # app config 163 | VONAGE_DEFAULT_CONVERSATION_ID=CON-a57b0...11e57f56d 164 | # as generated from `nexmo conversation:create` 165 | ``` 166 | 167 | ### Start the App Locally 168 | 169 | For now, there is no build. Later versions will provide build and deployment steps. 170 | 171 | Dev will run the server and client concurrently. 172 | 173 | ```bash 174 | npm run dev 175 | ``` 176 | 177 | ## Code of Conduct 178 | 179 | In the interest of fostering an open and welcoming environment, we strive to make participation in our project and our community a harassment-free experience for everyone. Please check out our [Code of Conduct][coc] in full. 180 | 181 | ## Contributing 182 | We :heart: contributions from everyone! Check out the [Contributing Guidelines][contributing] for more information. 183 | 184 | [![contributions welcome][contribadge]][issues] 185 | 186 | ## License 187 | 188 | This project is subject to the [MIT License][license] 189 | 190 | [logo]: vonage_logo.png "Vonage" 191 | [contribadge]: https://img.shields.io/badge/contributions-welcome-brightgreen.svg?style=flat "Contributions Welcome" 192 | 193 | [coc]: CODE_OF_CONDUCT.md "Code of Conduct" 194 | [contributing]: CONTRIBUTING.md "Contributing" 195 | [license]: LICENSE "MIT License" 196 | 197 | [issues]: ./../../issues "Issues" 198 | -------------------------------------------------------------------------------- /app.js: -------------------------------------------------------------------------------- 1 | var express = require('express'); 2 | var path = require('path'); 3 | var cookieParser = require('cookie-parser'); 4 | var logger = require('morgan'); 5 | 6 | var app = express(); 7 | 8 | app.use(logger('dev')); 9 | app.use(express.json()); 10 | app.use(express.urlencoded({ extended: false })); 11 | app.use(cookieParser()); 12 | app.use(express.static(path.join(__dirname, 'public'))); 13 | 14 | app.use('/api/user', require('./routes/user')); 15 | app.use('/api/server', require('./routes/server')); 16 | 17 | module.exports = app; 18 | -------------------------------------------------------------------------------- /bin/www: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | require('dotenv').config(); 4 | 5 | /** 6 | * Module dependencies. 7 | */ 8 | 9 | var app = require('../app'); 10 | var debug = require('debug')('vuejs-slack-clone:server'); 11 | var http = require('http'); 12 | 13 | /** 14 | * Get port from environment and store in Express. 15 | */ 16 | 17 | var port = normalizePort(process.env.PORT || '3000'); 18 | app.set('port', port); 19 | 20 | /** 21 | * Create HTTP server. 22 | */ 23 | 24 | var server = http.createServer(app); 25 | 26 | /** 27 | * Listen on provided port, on all network interfaces. 28 | */ 29 | 30 | server.listen(port); 31 | server.on('error', onError); 32 | server.on('listening', onListening); 33 | 34 | /** 35 | * Normalize a port into a number, string, or false. 36 | */ 37 | 38 | function normalizePort(val) { 39 | var port = parseInt(val, 10); 40 | 41 | if (isNaN(port)) { 42 | // named pipe 43 | return val; 44 | } 45 | 46 | if (port >= 0) { 47 | // port number 48 | return port; 49 | } 50 | 51 | return false; 52 | } 53 | 54 | /** 55 | * Event listener for HTTP server "error" event. 56 | */ 57 | 58 | function onError(error) { 59 | if (error.syscall !== 'listen') { 60 | throw error; 61 | } 62 | 63 | var bind = typeof port === 'string' 64 | ? 'Pipe ' + port 65 | : 'Port ' + port; 66 | 67 | // handle specific listen errors with friendly messages 68 | switch (error.code) { 69 | case 'EACCES': 70 | console.error(bind + ' requires elevated privileges'); 71 | process.exit(1); 72 | break; 73 | case 'EADDRINUSE': 74 | console.error(bind + ' is already in use'); 75 | process.exit(1); 76 | break; 77 | default: 78 | throw error; 79 | } 80 | } 81 | 82 | /** 83 | * Event listener for HTTP server "listening" event. 84 | */ 85 | 86 | function onListening() { 87 | var addr = server.address(); 88 | var bind = typeof addr === 'string' 89 | ? 'pipe ' + addr 90 | : 'port ' + addr.port; 91 | debug('Listening on ' + bind); 92 | } 93 | -------------------------------------------------------------------------------- /client/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /dist 4 | 5 | # local env files 6 | .env.local 7 | .env.*.local 8 | 9 | # Log files 10 | npm-debug.log* 11 | yarn-debug.log* 12 | yarn-error.log* 13 | 14 | # Editor directories and files 15 | .idea 16 | .vscode 17 | *.suo 18 | *.ntvs* 19 | *.njsproj 20 | *.sln 21 | *.sw? 22 | -------------------------------------------------------------------------------- /client/README.md: -------------------------------------------------------------------------------- 1 | # client 2 | 3 | ## Project setup 4 | ``` 5 | npm install 6 | ``` 7 | 8 | ### Compiles and hot-reloads for development 9 | ``` 10 | npm run serve 11 | ``` 12 | 13 | ### Compiles and minifies for production 14 | ``` 15 | npm run build 16 | ``` 17 | 18 | ### Lints and fixes files 19 | ``` 20 | npm run lint 21 | ``` 22 | 23 | ### Customize configuration 24 | See [Configuration Reference](https://cli.vuejs.org/config/). 25 | -------------------------------------------------------------------------------- /client/babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: [ 3 | '@vue/cli-plugin-babel/preset' 4 | ] 5 | } 6 | -------------------------------------------------------------------------------- /client/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "client", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "serve": "vue-cli-service serve", 7 | "build": "vue-cli-service build", 8 | "lint": "vue-cli-service lint" 9 | }, 10 | "dependencies": { 11 | "@fortawesome/fontawesome-svg-core": "^1.2.28", 12 | "@fortawesome/free-regular-svg-icons": "^5.13.0", 13 | "@fortawesome/free-solid-svg-icons": "^5.13.0", 14 | "@fortawesome/vue-fontawesome": "^0.1.9", 15 | "axios": "^0.19.2", 16 | "core-js": "^3.6.4", 17 | "nexmo-client": "^6.0.9", 18 | "tailwindcss": "^1.2.0", 19 | "vue": "^2.6.11" 20 | }, 21 | "devDependencies": { 22 | "@vue/cli-plugin-babel": "^4.2.0", 23 | "@vue/cli-plugin-eslint": "^4.2.0", 24 | "@vue/cli-service": "^4.2.0", 25 | "babel-eslint": "^10.0.3", 26 | "eslint": "^6.7.2", 27 | "eslint-plugin-vue": "^6.1.2", 28 | "vue-template-compiler": "^2.6.11" 29 | }, 30 | "eslintConfig": { 31 | "root": true, 32 | "env": { 33 | "node": true 34 | }, 35 | "extends": [ 36 | "plugin:vue/essential", 37 | "eslint:recommended" 38 | ], 39 | "parserOptions": { 40 | "parser": "babel-eslint" 41 | }, 42 | "rules": {} 43 | }, 44 | "browserslist": [ 45 | "> 1%", 46 | "last 2 versions" 47 | ] 48 | } 49 | -------------------------------------------------------------------------------- /client/postcss.config.js: -------------------------------------------------------------------------------- 1 | // postcss.config.js 2 | 3 | const autoprefixer = require('autoprefixer'); 4 | const tailwindcss = require('tailwindcss'); 5 | 6 | module.exports = { 7 | plugins: [ 8 | tailwindcss, 9 | autoprefixer, 10 | ], 11 | }; -------------------------------------------------------------------------------- /client/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nexmo-community/vuejs-slack-clone/9fdd28345e9b9a70747a0d56c1ab019a31c1dbc0/client/public/favicon.ico -------------------------------------------------------------------------------- /client/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | <%= htmlWebpackPlugin.options.title %> 9 | 10 | 11 | 14 |
15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /client/src/App.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 46 | -------------------------------------------------------------------------------- /client/src/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nexmo-community/vuejs-slack-clone/9fdd28345e9b9a70747a0d56c1ab019a31c1dbc0/client/src/assets/logo.png -------------------------------------------------------------------------------- /client/src/assets/styles/index.css: -------------------------------------------------------------------------------- 1 | /* src/assets/styles/index.css */ 2 | 3 | @tailwind base; 4 | @tailwind components; 5 | @tailwind utilities; 6 | -------------------------------------------------------------------------------- /client/src/components/ChatWindow.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | -------------------------------------------------------------------------------- /client/src/components/ChatWindowEvents.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 70 | -------------------------------------------------------------------------------- /client/src/components/ChatWindowFooter.vue: -------------------------------------------------------------------------------- 1 | 27 | 28 | 70 | 71 | -------------------------------------------------------------------------------- /client/src/components/ChatWindowHeader.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 18 | -------------------------------------------------------------------------------- /client/src/components/Error.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | 24 | 25 | -------------------------------------------------------------------------------- /client/src/components/Loading.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | -------------------------------------------------------------------------------- /client/src/components/Vonage.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 64 | -------------------------------------------------------------------------------- /client/src/main.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import App from './App.vue' 3 | import { library } from '@fortawesome/fontawesome-svg-core' 4 | import { fas } from '@fortawesome/free-solid-svg-icons' 5 | import { far } from '@fortawesome/free-regular-svg-icons' 6 | import { FontAwesomeIcon, FontAwesomeLayers } from '@fortawesome/vue-fontawesome' 7 | 8 | import './assets/styles/index.css'; 9 | 10 | library.add(fas, far) 11 | 12 | Vue.component('font-awesome-icon', FontAwesomeIcon) 13 | Vue.component('font-awesome-layers', FontAwesomeLayers) 14 | 15 | Vue.config.productionTip = false 16 | 17 | new Vue({ 18 | render: h => h(App), 19 | }).$mount('#app') 20 | -------------------------------------------------------------------------------- /client/src/services/Api.js: -------------------------------------------------------------------------------- 1 | // src/services/Api.js 2 | 3 | import axios from 'axios' 4 | 5 | export default() => { 6 | return axios.create({ 7 | baseURL: `/api`, 8 | headers: {'Cache-Control': 'no-cache, no-store, no-transform'} 9 | }) 10 | } -------------------------------------------------------------------------------- /client/src/services/Server.js: -------------------------------------------------------------------------------- 1 | // src/services/Server.js 2 | 3 | import Api from '@/services/Api' 4 | 5 | export default { 6 | fetchStatus () { 7 | return Api().get('server/status') 8 | } 9 | } -------------------------------------------------------------------------------- /client/src/services/User.js: -------------------------------------------------------------------------------- 1 | // src/services/User.js 2 | 3 | import Api from '@/services/Api' 4 | 5 | export default { 6 | fetchSession () { 7 | return Api().get('user/session') 8 | } 9 | } -------------------------------------------------------------------------------- /client/vue.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | devServer: { 3 | proxy: { 4 | "/api": { 5 | target: "http://localhost:3000", 6 | secure: false 7 | } 8 | } 9 | } 10 | }; -------------------------------------------------------------------------------- /controllers/server.js: -------------------------------------------------------------------------------- 1 | // controllers/server.js 2 | exports.status = function(req, res, next) { 3 | res.json({ 4 | defaultConversationId: process.env.VONAGE_DEFAULT_CONVERSATION_ID, 5 | status: 'ok' 6 | }); 7 | }; -------------------------------------------------------------------------------- /controllers/user.js: -------------------------------------------------------------------------------- 1 | exports.session = function(req, res, next) { 2 | res.json({ 3 | user: process.env.VONAGE_USER, 4 | token: process.env.VONAGE_USER_TOKEN 5 | }); 6 | }; -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vuejs-slack-clone", 3 | "version": "0.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "abbrev": { 8 | "version": "1.1.1", 9 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", 10 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", 11 | "dev": true 12 | }, 13 | "accepts": { 14 | "version": "1.3.7", 15 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", 16 | "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", 17 | "requires": { 18 | "mime-types": "~2.1.24", 19 | "negotiator": "0.6.2" 20 | } 21 | }, 22 | "ansi-align": { 23 | "version": "2.0.0", 24 | "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", 25 | "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", 26 | "dev": true, 27 | "requires": { 28 | "string-width": "^2.0.0" 29 | } 30 | }, 31 | "ansi-regex": { 32 | "version": "3.0.0", 33 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 34 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 35 | "dev": true 36 | }, 37 | "ansi-styles": { 38 | "version": "3.2.1", 39 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 40 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 41 | "dev": true, 42 | "requires": { 43 | "color-convert": "^1.9.0" 44 | } 45 | }, 46 | "anymatch": { 47 | "version": "3.1.1", 48 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", 49 | "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", 50 | "dev": true, 51 | "requires": { 52 | "normalize-path": "^3.0.0", 53 | "picomatch": "^2.0.4" 54 | } 55 | }, 56 | "array-flatten": { 57 | "version": "1.1.1", 58 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 59 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 60 | }, 61 | "balanced-match": { 62 | "version": "1.0.0", 63 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 64 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 65 | "dev": true 66 | }, 67 | "basic-auth": { 68 | "version": "2.0.1", 69 | "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", 70 | "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", 71 | "requires": { 72 | "safe-buffer": "5.1.2" 73 | } 74 | }, 75 | "binary-extensions": { 76 | "version": "2.0.0", 77 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", 78 | "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", 79 | "dev": true 80 | }, 81 | "body-parser": { 82 | "version": "1.18.3", 83 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", 84 | "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", 85 | "requires": { 86 | "bytes": "3.0.0", 87 | "content-type": "~1.0.4", 88 | "debug": "2.6.9", 89 | "depd": "~1.1.2", 90 | "http-errors": "~1.6.3", 91 | "iconv-lite": "0.4.23", 92 | "on-finished": "~2.3.0", 93 | "qs": "6.5.2", 94 | "raw-body": "2.3.3", 95 | "type-is": "~1.6.16" 96 | } 97 | }, 98 | "boxen": { 99 | "version": "1.3.0", 100 | "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", 101 | "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", 102 | "dev": true, 103 | "requires": { 104 | "ansi-align": "^2.0.0", 105 | "camelcase": "^4.0.0", 106 | "chalk": "^2.0.1", 107 | "cli-boxes": "^1.0.0", 108 | "string-width": "^2.0.0", 109 | "term-size": "^1.2.0", 110 | "widest-line": "^2.0.0" 111 | } 112 | }, 113 | "brace-expansion": { 114 | "version": "1.1.11", 115 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 116 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 117 | "dev": true, 118 | "requires": { 119 | "balanced-match": "^1.0.0", 120 | "concat-map": "0.0.1" 121 | } 122 | }, 123 | "braces": { 124 | "version": "3.0.2", 125 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 126 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 127 | "dev": true, 128 | "requires": { 129 | "fill-range": "^7.0.1" 130 | } 131 | }, 132 | "bytes": { 133 | "version": "3.0.0", 134 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", 135 | "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" 136 | }, 137 | "camelcase": { 138 | "version": "4.1.0", 139 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", 140 | "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", 141 | "dev": true 142 | }, 143 | "capture-stack-trace": { 144 | "version": "1.0.1", 145 | "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", 146 | "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==", 147 | "dev": true 148 | }, 149 | "chalk": { 150 | "version": "2.4.2", 151 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 152 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 153 | "dev": true, 154 | "requires": { 155 | "ansi-styles": "^3.2.1", 156 | "escape-string-regexp": "^1.0.5", 157 | "supports-color": "^5.3.0" 158 | } 159 | }, 160 | "chokidar": { 161 | "version": "3.3.1", 162 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.1.tgz", 163 | "integrity": "sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==", 164 | "dev": true, 165 | "requires": { 166 | "anymatch": "~3.1.1", 167 | "braces": "~3.0.2", 168 | "fsevents": "~2.1.2", 169 | "glob-parent": "~5.1.0", 170 | "is-binary-path": "~2.1.0", 171 | "is-glob": "~4.0.1", 172 | "normalize-path": "~3.0.0", 173 | "readdirp": "~3.3.0" 174 | } 175 | }, 176 | "ci-info": { 177 | "version": "1.6.0", 178 | "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", 179 | "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", 180 | "dev": true 181 | }, 182 | "cli-boxes": { 183 | "version": "1.0.0", 184 | "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", 185 | "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", 186 | "dev": true 187 | }, 188 | "cliui": { 189 | "version": "5.0.0", 190 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", 191 | "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", 192 | "dev": true, 193 | "requires": { 194 | "string-width": "^3.1.0", 195 | "strip-ansi": "^5.2.0", 196 | "wrap-ansi": "^5.1.0" 197 | }, 198 | "dependencies": { 199 | "ansi-regex": { 200 | "version": "4.1.0", 201 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 202 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 203 | "dev": true 204 | }, 205 | "string-width": { 206 | "version": "3.1.0", 207 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 208 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 209 | "dev": true, 210 | "requires": { 211 | "emoji-regex": "^7.0.1", 212 | "is-fullwidth-code-point": "^2.0.0", 213 | "strip-ansi": "^5.1.0" 214 | } 215 | }, 216 | "strip-ansi": { 217 | "version": "5.2.0", 218 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 219 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 220 | "dev": true, 221 | "requires": { 222 | "ansi-regex": "^4.1.0" 223 | } 224 | } 225 | } 226 | }, 227 | "color-convert": { 228 | "version": "1.9.3", 229 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 230 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 231 | "dev": true, 232 | "requires": { 233 | "color-name": "1.1.3" 234 | } 235 | }, 236 | "color-name": { 237 | "version": "1.1.3", 238 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 239 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 240 | "dev": true 241 | }, 242 | "concat-map": { 243 | "version": "0.0.1", 244 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 245 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 246 | "dev": true 247 | }, 248 | "concurrently": { 249 | "version": "5.1.0", 250 | "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-5.1.0.tgz", 251 | "integrity": "sha512-9ViZMu3OOCID3rBgU31mjBftro2chOop0G2u1olq1OuwRBVRw/GxHTg80TVJBUTJfoswMmEUeuOg1g1yu1X2dA==", 252 | "dev": true, 253 | "requires": { 254 | "chalk": "^2.4.2", 255 | "date-fns": "^2.0.1", 256 | "lodash": "^4.17.15", 257 | "read-pkg": "^4.0.1", 258 | "rxjs": "^6.5.2", 259 | "spawn-command": "^0.0.2-1", 260 | "supports-color": "^6.1.0", 261 | "tree-kill": "^1.2.2", 262 | "yargs": "^13.3.0" 263 | }, 264 | "dependencies": { 265 | "supports-color": { 266 | "version": "6.1.0", 267 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", 268 | "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", 269 | "dev": true, 270 | "requires": { 271 | "has-flag": "^3.0.0" 272 | } 273 | } 274 | } 275 | }, 276 | "configstore": { 277 | "version": "3.1.2", 278 | "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", 279 | "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", 280 | "dev": true, 281 | "requires": { 282 | "dot-prop": "^4.1.0", 283 | "graceful-fs": "^4.1.2", 284 | "make-dir": "^1.0.0", 285 | "unique-string": "^1.0.0", 286 | "write-file-atomic": "^2.0.0", 287 | "xdg-basedir": "^3.0.0" 288 | } 289 | }, 290 | "content-disposition": { 291 | "version": "0.5.2", 292 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", 293 | "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" 294 | }, 295 | "content-type": { 296 | "version": "1.0.4", 297 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 298 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 299 | }, 300 | "cookie": { 301 | "version": "0.3.1", 302 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", 303 | "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" 304 | }, 305 | "cookie-parser": { 306 | "version": "1.4.4", 307 | "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.4.tgz", 308 | "integrity": "sha512-lo13tqF3JEtFO7FyA49CqbhaFkskRJ0u/UAiINgrIXeRCY41c88/zxtrECl8AKH3B0hj9q10+h3Kt8I7KlW4tw==", 309 | "requires": { 310 | "cookie": "0.3.1", 311 | "cookie-signature": "1.0.6" 312 | } 313 | }, 314 | "cookie-signature": { 315 | "version": "1.0.6", 316 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 317 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 318 | }, 319 | "create-error-class": { 320 | "version": "3.0.2", 321 | "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", 322 | "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", 323 | "dev": true, 324 | "requires": { 325 | "capture-stack-trace": "^1.0.0" 326 | } 327 | }, 328 | "cross-spawn": { 329 | "version": "5.1.0", 330 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", 331 | "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", 332 | "dev": true, 333 | "requires": { 334 | "lru-cache": "^4.0.1", 335 | "shebang-command": "^1.2.0", 336 | "which": "^1.2.9" 337 | } 338 | }, 339 | "crypto-random-string": { 340 | "version": "1.0.0", 341 | "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", 342 | "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", 343 | "dev": true 344 | }, 345 | "date-fns": { 346 | "version": "2.10.0", 347 | "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.10.0.tgz", 348 | "integrity": "sha512-EhfEKevYGWhWlZbNeplfhIU/+N+x0iCIx7VzKlXma2EdQyznVlZhCptXUY+BegNpPW2kjdx15Rvq503YcXXrcA==", 349 | "dev": true 350 | }, 351 | "debug": { 352 | "version": "2.6.9", 353 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 354 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 355 | "requires": { 356 | "ms": "2.0.0" 357 | } 358 | }, 359 | "decamelize": { 360 | "version": "1.2.0", 361 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 362 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", 363 | "dev": true 364 | }, 365 | "deep-extend": { 366 | "version": "0.6.0", 367 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", 368 | "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", 369 | "dev": true 370 | }, 371 | "depd": { 372 | "version": "1.1.2", 373 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 374 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 375 | }, 376 | "destroy": { 377 | "version": "1.0.4", 378 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 379 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 380 | }, 381 | "dot-prop": { 382 | "version": "4.2.0", 383 | "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", 384 | "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", 385 | "dev": true, 386 | "requires": { 387 | "is-obj": "^1.0.0" 388 | } 389 | }, 390 | "dotenv": { 391 | "version": "8.2.0", 392 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", 393 | "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==" 394 | }, 395 | "duplexer3": { 396 | "version": "0.1.4", 397 | "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", 398 | "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", 399 | "dev": true 400 | }, 401 | "ee-first": { 402 | "version": "1.1.1", 403 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 404 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 405 | }, 406 | "emoji-regex": { 407 | "version": "7.0.3", 408 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", 409 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", 410 | "dev": true 411 | }, 412 | "encodeurl": { 413 | "version": "1.0.2", 414 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 415 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 416 | }, 417 | "error-ex": { 418 | "version": "1.3.2", 419 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", 420 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", 421 | "dev": true, 422 | "requires": { 423 | "is-arrayish": "^0.2.1" 424 | } 425 | }, 426 | "escape-html": { 427 | "version": "1.0.3", 428 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 429 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 430 | }, 431 | "escape-string-regexp": { 432 | "version": "1.0.5", 433 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 434 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 435 | "dev": true 436 | }, 437 | "etag": { 438 | "version": "1.8.1", 439 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 440 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 441 | }, 442 | "execa": { 443 | "version": "0.7.0", 444 | "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", 445 | "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", 446 | "dev": true, 447 | "requires": { 448 | "cross-spawn": "^5.0.1", 449 | "get-stream": "^3.0.0", 450 | "is-stream": "^1.1.0", 451 | "npm-run-path": "^2.0.0", 452 | "p-finally": "^1.0.0", 453 | "signal-exit": "^3.0.0", 454 | "strip-eof": "^1.0.0" 455 | } 456 | }, 457 | "express": { 458 | "version": "4.16.4", 459 | "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", 460 | "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", 461 | "requires": { 462 | "accepts": "~1.3.5", 463 | "array-flatten": "1.1.1", 464 | "body-parser": "1.18.3", 465 | "content-disposition": "0.5.2", 466 | "content-type": "~1.0.4", 467 | "cookie": "0.3.1", 468 | "cookie-signature": "1.0.6", 469 | "debug": "2.6.9", 470 | "depd": "~1.1.2", 471 | "encodeurl": "~1.0.2", 472 | "escape-html": "~1.0.3", 473 | "etag": "~1.8.1", 474 | "finalhandler": "1.1.1", 475 | "fresh": "0.5.2", 476 | "merge-descriptors": "1.0.1", 477 | "methods": "~1.1.2", 478 | "on-finished": "~2.3.0", 479 | "parseurl": "~1.3.2", 480 | "path-to-regexp": "0.1.7", 481 | "proxy-addr": "~2.0.4", 482 | "qs": "6.5.2", 483 | "range-parser": "~1.2.0", 484 | "safe-buffer": "5.1.2", 485 | "send": "0.16.2", 486 | "serve-static": "1.13.2", 487 | "setprototypeof": "1.1.0", 488 | "statuses": "~1.4.0", 489 | "type-is": "~1.6.16", 490 | "utils-merge": "1.0.1", 491 | "vary": "~1.1.2" 492 | } 493 | }, 494 | "fill-range": { 495 | "version": "7.0.1", 496 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 497 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 498 | "dev": true, 499 | "requires": { 500 | "to-regex-range": "^5.0.1" 501 | } 502 | }, 503 | "finalhandler": { 504 | "version": "1.1.1", 505 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", 506 | "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", 507 | "requires": { 508 | "debug": "2.6.9", 509 | "encodeurl": "~1.0.2", 510 | "escape-html": "~1.0.3", 511 | "on-finished": "~2.3.0", 512 | "parseurl": "~1.3.2", 513 | "statuses": "~1.4.0", 514 | "unpipe": "~1.0.0" 515 | } 516 | }, 517 | "find-up": { 518 | "version": "3.0.0", 519 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", 520 | "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", 521 | "dev": true, 522 | "requires": { 523 | "locate-path": "^3.0.0" 524 | } 525 | }, 526 | "forwarded": { 527 | "version": "0.1.2", 528 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 529 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" 530 | }, 531 | "fresh": { 532 | "version": "0.5.2", 533 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 534 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 535 | }, 536 | "fsevents": { 537 | "version": "2.1.2", 538 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", 539 | "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", 540 | "dev": true, 541 | "optional": true 542 | }, 543 | "get-caller-file": { 544 | "version": "2.0.5", 545 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 546 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 547 | "dev": true 548 | }, 549 | "get-stream": { 550 | "version": "3.0.0", 551 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", 552 | "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", 553 | "dev": true 554 | }, 555 | "glob-parent": { 556 | "version": "5.1.0", 557 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", 558 | "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", 559 | "dev": true, 560 | "requires": { 561 | "is-glob": "^4.0.1" 562 | } 563 | }, 564 | "global-dirs": { 565 | "version": "0.1.1", 566 | "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", 567 | "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", 568 | "dev": true, 569 | "requires": { 570 | "ini": "^1.3.4" 571 | } 572 | }, 573 | "got": { 574 | "version": "6.7.1", 575 | "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", 576 | "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", 577 | "dev": true, 578 | "requires": { 579 | "create-error-class": "^3.0.0", 580 | "duplexer3": "^0.1.4", 581 | "get-stream": "^3.0.0", 582 | "is-redirect": "^1.0.0", 583 | "is-retry-allowed": "^1.0.0", 584 | "is-stream": "^1.0.0", 585 | "lowercase-keys": "^1.0.0", 586 | "safe-buffer": "^5.0.1", 587 | "timed-out": "^4.0.0", 588 | "unzip-response": "^2.0.1", 589 | "url-parse-lax": "^1.0.0" 590 | } 591 | }, 592 | "graceful-fs": { 593 | "version": "4.2.3", 594 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", 595 | "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", 596 | "dev": true 597 | }, 598 | "has-flag": { 599 | "version": "3.0.0", 600 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 601 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 602 | "dev": true 603 | }, 604 | "hosted-git-info": { 605 | "version": "2.8.7", 606 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.7.tgz", 607 | "integrity": "sha512-ChkjQtKJ3GI6SsI4O5jwr8q8EPrWCnxuc4Tbx+vRI5x6mDOpjKKltNo1lRlszw3xwgTOSns1ZRBiMmmwpcvLxg==", 608 | "dev": true 609 | }, 610 | "http-errors": { 611 | "version": "1.6.3", 612 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", 613 | "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", 614 | "requires": { 615 | "depd": "~1.1.2", 616 | "inherits": "2.0.3", 617 | "setprototypeof": "1.1.0", 618 | "statuses": ">= 1.4.0 < 2" 619 | } 620 | }, 621 | "iconv-lite": { 622 | "version": "0.4.23", 623 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", 624 | "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", 625 | "requires": { 626 | "safer-buffer": ">= 2.1.2 < 3" 627 | } 628 | }, 629 | "ignore-by-default": { 630 | "version": "1.0.1", 631 | "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", 632 | "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=", 633 | "dev": true 634 | }, 635 | "import-lazy": { 636 | "version": "2.1.0", 637 | "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", 638 | "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", 639 | "dev": true 640 | }, 641 | "imurmurhash": { 642 | "version": "0.1.4", 643 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 644 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 645 | "dev": true 646 | }, 647 | "inherits": { 648 | "version": "2.0.3", 649 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 650 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 651 | }, 652 | "ini": { 653 | "version": "1.3.5", 654 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", 655 | "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", 656 | "dev": true 657 | }, 658 | "ipaddr.js": { 659 | "version": "1.9.1", 660 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 661 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" 662 | }, 663 | "is-arrayish": { 664 | "version": "0.2.1", 665 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 666 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", 667 | "dev": true 668 | }, 669 | "is-binary-path": { 670 | "version": "2.1.0", 671 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 672 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 673 | "dev": true, 674 | "requires": { 675 | "binary-extensions": "^2.0.0" 676 | } 677 | }, 678 | "is-ci": { 679 | "version": "1.2.1", 680 | "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", 681 | "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", 682 | "dev": true, 683 | "requires": { 684 | "ci-info": "^1.5.0" 685 | } 686 | }, 687 | "is-extglob": { 688 | "version": "2.1.1", 689 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 690 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 691 | "dev": true 692 | }, 693 | "is-fullwidth-code-point": { 694 | "version": "2.0.0", 695 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 696 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 697 | "dev": true 698 | }, 699 | "is-glob": { 700 | "version": "4.0.1", 701 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", 702 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", 703 | "dev": true, 704 | "requires": { 705 | "is-extglob": "^2.1.1" 706 | } 707 | }, 708 | "is-installed-globally": { 709 | "version": "0.1.0", 710 | "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", 711 | "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", 712 | "dev": true, 713 | "requires": { 714 | "global-dirs": "^0.1.0", 715 | "is-path-inside": "^1.0.0" 716 | } 717 | }, 718 | "is-npm": { 719 | "version": "1.0.0", 720 | "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", 721 | "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=", 722 | "dev": true 723 | }, 724 | "is-number": { 725 | "version": "7.0.0", 726 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 727 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 728 | "dev": true 729 | }, 730 | "is-obj": { 731 | "version": "1.0.1", 732 | "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", 733 | "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", 734 | "dev": true 735 | }, 736 | "is-path-inside": { 737 | "version": "1.0.1", 738 | "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", 739 | "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", 740 | "dev": true, 741 | "requires": { 742 | "path-is-inside": "^1.0.1" 743 | } 744 | }, 745 | "is-redirect": { 746 | "version": "1.0.0", 747 | "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", 748 | "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", 749 | "dev": true 750 | }, 751 | "is-retry-allowed": { 752 | "version": "1.2.0", 753 | "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", 754 | "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", 755 | "dev": true 756 | }, 757 | "is-stream": { 758 | "version": "1.1.0", 759 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", 760 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", 761 | "dev": true 762 | }, 763 | "isexe": { 764 | "version": "2.0.0", 765 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 766 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 767 | "dev": true 768 | }, 769 | "json-parse-better-errors": { 770 | "version": "1.0.2", 771 | "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", 772 | "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", 773 | "dev": true 774 | }, 775 | "latest-version": { 776 | "version": "3.1.0", 777 | "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", 778 | "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", 779 | "dev": true, 780 | "requires": { 781 | "package-json": "^4.0.0" 782 | } 783 | }, 784 | "locate-path": { 785 | "version": "3.0.0", 786 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", 787 | "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", 788 | "dev": true, 789 | "requires": { 790 | "p-locate": "^3.0.0", 791 | "path-exists": "^3.0.0" 792 | } 793 | }, 794 | "lodash": { 795 | "version": "4.17.15", 796 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", 797 | "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", 798 | "dev": true 799 | }, 800 | "lowercase-keys": { 801 | "version": "1.0.1", 802 | "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", 803 | "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", 804 | "dev": true 805 | }, 806 | "lru-cache": { 807 | "version": "4.1.5", 808 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", 809 | "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", 810 | "dev": true, 811 | "requires": { 812 | "pseudomap": "^1.0.2", 813 | "yallist": "^2.1.2" 814 | } 815 | }, 816 | "make-dir": { 817 | "version": "1.3.0", 818 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", 819 | "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", 820 | "dev": true, 821 | "requires": { 822 | "pify": "^3.0.0" 823 | } 824 | }, 825 | "media-typer": { 826 | "version": "0.3.0", 827 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 828 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 829 | }, 830 | "merge-descriptors": { 831 | "version": "1.0.1", 832 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 833 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 834 | }, 835 | "methods": { 836 | "version": "1.1.2", 837 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 838 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 839 | }, 840 | "mime": { 841 | "version": "1.4.1", 842 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", 843 | "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" 844 | }, 845 | "mime-db": { 846 | "version": "1.43.0", 847 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", 848 | "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==" 849 | }, 850 | "mime-types": { 851 | "version": "2.1.26", 852 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", 853 | "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", 854 | "requires": { 855 | "mime-db": "1.43.0" 856 | } 857 | }, 858 | "minimatch": { 859 | "version": "3.0.4", 860 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 861 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 862 | "dev": true, 863 | "requires": { 864 | "brace-expansion": "^1.1.7" 865 | } 866 | }, 867 | "minimist": { 868 | "version": "1.2.5", 869 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 870 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", 871 | "dev": true 872 | }, 873 | "morgan": { 874 | "version": "1.9.1", 875 | "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.1.tgz", 876 | "integrity": "sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA==", 877 | "requires": { 878 | "basic-auth": "~2.0.0", 879 | "debug": "2.6.9", 880 | "depd": "~1.1.2", 881 | "on-finished": "~2.3.0", 882 | "on-headers": "~1.0.1" 883 | } 884 | }, 885 | "ms": { 886 | "version": "2.0.0", 887 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 888 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 889 | }, 890 | "negotiator": { 891 | "version": "0.6.2", 892 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", 893 | "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" 894 | }, 895 | "nodemon": { 896 | "version": "2.0.2", 897 | "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.2.tgz", 898 | "integrity": "sha512-GWhYPMfde2+M0FsHnggIHXTqPDHXia32HRhh6H0d75Mt9FKUoCBvumNHr7LdrpPBTKxsWmIEOjoN+P4IU6Hcaw==", 899 | "dev": true, 900 | "requires": { 901 | "chokidar": "^3.2.2", 902 | "debug": "^3.2.6", 903 | "ignore-by-default": "^1.0.1", 904 | "minimatch": "^3.0.4", 905 | "pstree.remy": "^1.1.7", 906 | "semver": "^5.7.1", 907 | "supports-color": "^5.5.0", 908 | "touch": "^3.1.0", 909 | "undefsafe": "^2.0.2", 910 | "update-notifier": "^2.5.0" 911 | }, 912 | "dependencies": { 913 | "debug": { 914 | "version": "3.2.6", 915 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", 916 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", 917 | "dev": true, 918 | "requires": { 919 | "ms": "^2.1.1" 920 | } 921 | }, 922 | "ms": { 923 | "version": "2.1.2", 924 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 925 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 926 | "dev": true 927 | } 928 | } 929 | }, 930 | "nopt": { 931 | "version": "1.0.10", 932 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", 933 | "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", 934 | "dev": true, 935 | "requires": { 936 | "abbrev": "1" 937 | } 938 | }, 939 | "normalize-package-data": { 940 | "version": "2.5.0", 941 | "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", 942 | "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", 943 | "dev": true, 944 | "requires": { 945 | "hosted-git-info": "^2.1.4", 946 | "resolve": "^1.10.0", 947 | "semver": "2 || 3 || 4 || 5", 948 | "validate-npm-package-license": "^3.0.1" 949 | } 950 | }, 951 | "normalize-path": { 952 | "version": "3.0.0", 953 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 954 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 955 | "dev": true 956 | }, 957 | "npm-run-path": { 958 | "version": "2.0.2", 959 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", 960 | "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", 961 | "dev": true, 962 | "requires": { 963 | "path-key": "^2.0.0" 964 | } 965 | }, 966 | "on-finished": { 967 | "version": "2.3.0", 968 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 969 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 970 | "requires": { 971 | "ee-first": "1.1.1" 972 | } 973 | }, 974 | "on-headers": { 975 | "version": "1.0.2", 976 | "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", 977 | "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" 978 | }, 979 | "p-finally": { 980 | "version": "1.0.0", 981 | "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", 982 | "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", 983 | "dev": true 984 | }, 985 | "p-limit": { 986 | "version": "2.2.2", 987 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", 988 | "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", 989 | "dev": true, 990 | "requires": { 991 | "p-try": "^2.0.0" 992 | } 993 | }, 994 | "p-locate": { 995 | "version": "3.0.0", 996 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", 997 | "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", 998 | "dev": true, 999 | "requires": { 1000 | "p-limit": "^2.0.0" 1001 | } 1002 | }, 1003 | "p-try": { 1004 | "version": "2.2.0", 1005 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", 1006 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", 1007 | "dev": true 1008 | }, 1009 | "package-json": { 1010 | "version": "4.0.1", 1011 | "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", 1012 | "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", 1013 | "dev": true, 1014 | "requires": { 1015 | "got": "^6.7.1", 1016 | "registry-auth-token": "^3.0.1", 1017 | "registry-url": "^3.0.3", 1018 | "semver": "^5.1.0" 1019 | } 1020 | }, 1021 | "parse-json": { 1022 | "version": "4.0.0", 1023 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", 1024 | "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", 1025 | "dev": true, 1026 | "requires": { 1027 | "error-ex": "^1.3.1", 1028 | "json-parse-better-errors": "^1.0.1" 1029 | } 1030 | }, 1031 | "parseurl": { 1032 | "version": "1.3.3", 1033 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 1034 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 1035 | }, 1036 | "path-exists": { 1037 | "version": "3.0.0", 1038 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 1039 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", 1040 | "dev": true 1041 | }, 1042 | "path-is-inside": { 1043 | "version": "1.0.2", 1044 | "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", 1045 | "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", 1046 | "dev": true 1047 | }, 1048 | "path-key": { 1049 | "version": "2.0.1", 1050 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", 1051 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", 1052 | "dev": true 1053 | }, 1054 | "path-parse": { 1055 | "version": "1.0.6", 1056 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", 1057 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", 1058 | "dev": true 1059 | }, 1060 | "path-to-regexp": { 1061 | "version": "0.1.7", 1062 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 1063 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 1064 | }, 1065 | "picomatch": { 1066 | "version": "2.2.1", 1067 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.1.tgz", 1068 | "integrity": "sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA==", 1069 | "dev": true 1070 | }, 1071 | "pify": { 1072 | "version": "3.0.0", 1073 | "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", 1074 | "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", 1075 | "dev": true 1076 | }, 1077 | "prepend-http": { 1078 | "version": "1.0.4", 1079 | "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", 1080 | "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", 1081 | "dev": true 1082 | }, 1083 | "proxy-addr": { 1084 | "version": "2.0.6", 1085 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", 1086 | "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", 1087 | "requires": { 1088 | "forwarded": "~0.1.2", 1089 | "ipaddr.js": "1.9.1" 1090 | } 1091 | }, 1092 | "pseudomap": { 1093 | "version": "1.0.2", 1094 | "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", 1095 | "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", 1096 | "dev": true 1097 | }, 1098 | "pstree.remy": { 1099 | "version": "1.1.7", 1100 | "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.7.tgz", 1101 | "integrity": "sha512-xsMgrUwRpuGskEzBFkH8NmTimbZ5PcPup0LA8JJkHIm2IMUbQcpo3yeLNWVrufEYjh8YwtSVh0xz6UeWc5Oh5A==", 1102 | "dev": true 1103 | }, 1104 | "qs": { 1105 | "version": "6.5.2", 1106 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 1107 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" 1108 | }, 1109 | "range-parser": { 1110 | "version": "1.2.1", 1111 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 1112 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" 1113 | }, 1114 | "raw-body": { 1115 | "version": "2.3.3", 1116 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", 1117 | "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", 1118 | "requires": { 1119 | "bytes": "3.0.0", 1120 | "http-errors": "1.6.3", 1121 | "iconv-lite": "0.4.23", 1122 | "unpipe": "1.0.0" 1123 | } 1124 | }, 1125 | "rc": { 1126 | "version": "1.2.8", 1127 | "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", 1128 | "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", 1129 | "dev": true, 1130 | "requires": { 1131 | "deep-extend": "^0.6.0", 1132 | "ini": "~1.3.0", 1133 | "minimist": "^1.2.0", 1134 | "strip-json-comments": "~2.0.1" 1135 | } 1136 | }, 1137 | "read-pkg": { 1138 | "version": "4.0.1", 1139 | "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-4.0.1.tgz", 1140 | "integrity": "sha1-ljYlN48+HE1IyFhytabsfV0JMjc=", 1141 | "dev": true, 1142 | "requires": { 1143 | "normalize-package-data": "^2.3.2", 1144 | "parse-json": "^4.0.0", 1145 | "pify": "^3.0.0" 1146 | } 1147 | }, 1148 | "readdirp": { 1149 | "version": "3.3.0", 1150 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.3.0.tgz", 1151 | "integrity": "sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==", 1152 | "dev": true, 1153 | "requires": { 1154 | "picomatch": "^2.0.7" 1155 | } 1156 | }, 1157 | "registry-auth-token": { 1158 | "version": "3.4.0", 1159 | "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", 1160 | "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==", 1161 | "dev": true, 1162 | "requires": { 1163 | "rc": "^1.1.6", 1164 | "safe-buffer": "^5.0.1" 1165 | } 1166 | }, 1167 | "registry-url": { 1168 | "version": "3.1.0", 1169 | "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", 1170 | "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", 1171 | "dev": true, 1172 | "requires": { 1173 | "rc": "^1.0.1" 1174 | } 1175 | }, 1176 | "require-directory": { 1177 | "version": "2.1.1", 1178 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 1179 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", 1180 | "dev": true 1181 | }, 1182 | "require-main-filename": { 1183 | "version": "2.0.0", 1184 | "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", 1185 | "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", 1186 | "dev": true 1187 | }, 1188 | "resolve": { 1189 | "version": "1.15.1", 1190 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", 1191 | "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", 1192 | "dev": true, 1193 | "requires": { 1194 | "path-parse": "^1.0.6" 1195 | } 1196 | }, 1197 | "rxjs": { 1198 | "version": "6.5.4", 1199 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", 1200 | "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", 1201 | "dev": true, 1202 | "requires": { 1203 | "tslib": "^1.9.0" 1204 | } 1205 | }, 1206 | "safe-buffer": { 1207 | "version": "5.1.2", 1208 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1209 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1210 | }, 1211 | "safer-buffer": { 1212 | "version": "2.1.2", 1213 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1214 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1215 | }, 1216 | "semver": { 1217 | "version": "5.7.1", 1218 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 1219 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 1220 | "dev": true 1221 | }, 1222 | "semver-diff": { 1223 | "version": "2.1.0", 1224 | "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", 1225 | "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", 1226 | "dev": true, 1227 | "requires": { 1228 | "semver": "^5.0.3" 1229 | } 1230 | }, 1231 | "send": { 1232 | "version": "0.16.2", 1233 | "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", 1234 | "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", 1235 | "requires": { 1236 | "debug": "2.6.9", 1237 | "depd": "~1.1.2", 1238 | "destroy": "~1.0.4", 1239 | "encodeurl": "~1.0.2", 1240 | "escape-html": "~1.0.3", 1241 | "etag": "~1.8.1", 1242 | "fresh": "0.5.2", 1243 | "http-errors": "~1.6.2", 1244 | "mime": "1.4.1", 1245 | "ms": "2.0.0", 1246 | "on-finished": "~2.3.0", 1247 | "range-parser": "~1.2.0", 1248 | "statuses": "~1.4.0" 1249 | } 1250 | }, 1251 | "serve-static": { 1252 | "version": "1.13.2", 1253 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", 1254 | "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", 1255 | "requires": { 1256 | "encodeurl": "~1.0.2", 1257 | "escape-html": "~1.0.3", 1258 | "parseurl": "~1.3.2", 1259 | "send": "0.16.2" 1260 | } 1261 | }, 1262 | "set-blocking": { 1263 | "version": "2.0.0", 1264 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 1265 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", 1266 | "dev": true 1267 | }, 1268 | "setprototypeof": { 1269 | "version": "1.1.0", 1270 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", 1271 | "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" 1272 | }, 1273 | "shebang-command": { 1274 | "version": "1.2.0", 1275 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 1276 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 1277 | "dev": true, 1278 | "requires": { 1279 | "shebang-regex": "^1.0.0" 1280 | } 1281 | }, 1282 | "shebang-regex": { 1283 | "version": "1.0.0", 1284 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 1285 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", 1286 | "dev": true 1287 | }, 1288 | "signal-exit": { 1289 | "version": "3.0.2", 1290 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 1291 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", 1292 | "dev": true 1293 | }, 1294 | "spawn-command": { 1295 | "version": "0.0.2-1", 1296 | "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", 1297 | "integrity": "sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A=", 1298 | "dev": true 1299 | }, 1300 | "spdx-correct": { 1301 | "version": "3.1.0", 1302 | "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", 1303 | "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", 1304 | "dev": true, 1305 | "requires": { 1306 | "spdx-expression-parse": "^3.0.0", 1307 | "spdx-license-ids": "^3.0.0" 1308 | } 1309 | }, 1310 | "spdx-exceptions": { 1311 | "version": "2.2.0", 1312 | "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", 1313 | "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", 1314 | "dev": true 1315 | }, 1316 | "spdx-expression-parse": { 1317 | "version": "3.0.0", 1318 | "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", 1319 | "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", 1320 | "dev": true, 1321 | "requires": { 1322 | "spdx-exceptions": "^2.1.0", 1323 | "spdx-license-ids": "^3.0.0" 1324 | } 1325 | }, 1326 | "spdx-license-ids": { 1327 | "version": "3.0.5", 1328 | "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", 1329 | "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", 1330 | "dev": true 1331 | }, 1332 | "statuses": { 1333 | "version": "1.4.0", 1334 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", 1335 | "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" 1336 | }, 1337 | "string-width": { 1338 | "version": "2.1.1", 1339 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 1340 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 1341 | "dev": true, 1342 | "requires": { 1343 | "is-fullwidth-code-point": "^2.0.0", 1344 | "strip-ansi": "^4.0.0" 1345 | } 1346 | }, 1347 | "strip-ansi": { 1348 | "version": "4.0.0", 1349 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 1350 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 1351 | "dev": true, 1352 | "requires": { 1353 | "ansi-regex": "^3.0.0" 1354 | } 1355 | }, 1356 | "strip-eof": { 1357 | "version": "1.0.0", 1358 | "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", 1359 | "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", 1360 | "dev": true 1361 | }, 1362 | "strip-json-comments": { 1363 | "version": "2.0.1", 1364 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 1365 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", 1366 | "dev": true 1367 | }, 1368 | "supports-color": { 1369 | "version": "5.5.0", 1370 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1371 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1372 | "dev": true, 1373 | "requires": { 1374 | "has-flag": "^3.0.0" 1375 | } 1376 | }, 1377 | "term-size": { 1378 | "version": "1.2.0", 1379 | "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", 1380 | "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", 1381 | "dev": true, 1382 | "requires": { 1383 | "execa": "^0.7.0" 1384 | } 1385 | }, 1386 | "timed-out": { 1387 | "version": "4.0.1", 1388 | "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", 1389 | "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", 1390 | "dev": true 1391 | }, 1392 | "to-regex-range": { 1393 | "version": "5.0.1", 1394 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1395 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1396 | "dev": true, 1397 | "requires": { 1398 | "is-number": "^7.0.0" 1399 | } 1400 | }, 1401 | "touch": { 1402 | "version": "3.1.0", 1403 | "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", 1404 | "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", 1405 | "dev": true, 1406 | "requires": { 1407 | "nopt": "~1.0.10" 1408 | } 1409 | }, 1410 | "tree-kill": { 1411 | "version": "1.2.2", 1412 | "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", 1413 | "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", 1414 | "dev": true 1415 | }, 1416 | "tslib": { 1417 | "version": "1.11.0", 1418 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.0.tgz", 1419 | "integrity": "sha512-BmndXUtiTn/VDDrJzQE7Mm22Ix3PxgLltW9bSNLoeCY31gnG2OPx0QqJnuc9oMIKioYrz487i6K9o4Pdn0j+Kg==", 1420 | "dev": true 1421 | }, 1422 | "type-is": { 1423 | "version": "1.6.18", 1424 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 1425 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 1426 | "requires": { 1427 | "media-typer": "0.3.0", 1428 | "mime-types": "~2.1.24" 1429 | } 1430 | }, 1431 | "undefsafe": { 1432 | "version": "2.0.3", 1433 | "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz", 1434 | "integrity": "sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==", 1435 | "dev": true, 1436 | "requires": { 1437 | "debug": "^2.2.0" 1438 | } 1439 | }, 1440 | "unique-string": { 1441 | "version": "1.0.0", 1442 | "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", 1443 | "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", 1444 | "dev": true, 1445 | "requires": { 1446 | "crypto-random-string": "^1.0.0" 1447 | } 1448 | }, 1449 | "unpipe": { 1450 | "version": "1.0.0", 1451 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1452 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 1453 | }, 1454 | "unzip-response": { 1455 | "version": "2.0.1", 1456 | "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", 1457 | "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", 1458 | "dev": true 1459 | }, 1460 | "update-notifier": { 1461 | "version": "2.5.0", 1462 | "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", 1463 | "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", 1464 | "dev": true, 1465 | "requires": { 1466 | "boxen": "^1.2.1", 1467 | "chalk": "^2.0.1", 1468 | "configstore": "^3.0.0", 1469 | "import-lazy": "^2.1.0", 1470 | "is-ci": "^1.0.10", 1471 | "is-installed-globally": "^0.1.0", 1472 | "is-npm": "^1.0.0", 1473 | "latest-version": "^3.0.0", 1474 | "semver-diff": "^2.0.0", 1475 | "xdg-basedir": "^3.0.0" 1476 | } 1477 | }, 1478 | "url-parse-lax": { 1479 | "version": "1.0.0", 1480 | "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", 1481 | "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", 1482 | "dev": true, 1483 | "requires": { 1484 | "prepend-http": "^1.0.1" 1485 | } 1486 | }, 1487 | "utils-merge": { 1488 | "version": "1.0.1", 1489 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 1490 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 1491 | }, 1492 | "validate-npm-package-license": { 1493 | "version": "3.0.4", 1494 | "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", 1495 | "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", 1496 | "dev": true, 1497 | "requires": { 1498 | "spdx-correct": "^3.0.0", 1499 | "spdx-expression-parse": "^3.0.0" 1500 | } 1501 | }, 1502 | "vary": { 1503 | "version": "1.1.2", 1504 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1505 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 1506 | }, 1507 | "which": { 1508 | "version": "1.3.1", 1509 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 1510 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 1511 | "dev": true, 1512 | "requires": { 1513 | "isexe": "^2.0.0" 1514 | } 1515 | }, 1516 | "which-module": { 1517 | "version": "2.0.0", 1518 | "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", 1519 | "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", 1520 | "dev": true 1521 | }, 1522 | "widest-line": { 1523 | "version": "2.0.1", 1524 | "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", 1525 | "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", 1526 | "dev": true, 1527 | "requires": { 1528 | "string-width": "^2.1.1" 1529 | } 1530 | }, 1531 | "wrap-ansi": { 1532 | "version": "5.1.0", 1533 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", 1534 | "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", 1535 | "dev": true, 1536 | "requires": { 1537 | "ansi-styles": "^3.2.0", 1538 | "string-width": "^3.0.0", 1539 | "strip-ansi": "^5.0.0" 1540 | }, 1541 | "dependencies": { 1542 | "ansi-regex": { 1543 | "version": "4.1.0", 1544 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 1545 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 1546 | "dev": true 1547 | }, 1548 | "string-width": { 1549 | "version": "3.1.0", 1550 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 1551 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 1552 | "dev": true, 1553 | "requires": { 1554 | "emoji-regex": "^7.0.1", 1555 | "is-fullwidth-code-point": "^2.0.0", 1556 | "strip-ansi": "^5.1.0" 1557 | } 1558 | }, 1559 | "strip-ansi": { 1560 | "version": "5.2.0", 1561 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 1562 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 1563 | "dev": true, 1564 | "requires": { 1565 | "ansi-regex": "^4.1.0" 1566 | } 1567 | } 1568 | } 1569 | }, 1570 | "write-file-atomic": { 1571 | "version": "2.4.3", 1572 | "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", 1573 | "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", 1574 | "dev": true, 1575 | "requires": { 1576 | "graceful-fs": "^4.1.11", 1577 | "imurmurhash": "^0.1.4", 1578 | "signal-exit": "^3.0.2" 1579 | } 1580 | }, 1581 | "xdg-basedir": { 1582 | "version": "3.0.0", 1583 | "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", 1584 | "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", 1585 | "dev": true 1586 | }, 1587 | "y18n": { 1588 | "version": "4.0.0", 1589 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", 1590 | "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", 1591 | "dev": true 1592 | }, 1593 | "yallist": { 1594 | "version": "2.1.2", 1595 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", 1596 | "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", 1597 | "dev": true 1598 | }, 1599 | "yargs": { 1600 | "version": "13.3.0", 1601 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", 1602 | "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", 1603 | "dev": true, 1604 | "requires": { 1605 | "cliui": "^5.0.0", 1606 | "find-up": "^3.0.0", 1607 | "get-caller-file": "^2.0.1", 1608 | "require-directory": "^2.1.1", 1609 | "require-main-filename": "^2.0.0", 1610 | "set-blocking": "^2.0.0", 1611 | "string-width": "^3.0.0", 1612 | "which-module": "^2.0.0", 1613 | "y18n": "^4.0.0", 1614 | "yargs-parser": "^13.1.1" 1615 | }, 1616 | "dependencies": { 1617 | "ansi-regex": { 1618 | "version": "4.1.0", 1619 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 1620 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 1621 | "dev": true 1622 | }, 1623 | "string-width": { 1624 | "version": "3.1.0", 1625 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 1626 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 1627 | "dev": true, 1628 | "requires": { 1629 | "emoji-regex": "^7.0.1", 1630 | "is-fullwidth-code-point": "^2.0.0", 1631 | "strip-ansi": "^5.1.0" 1632 | } 1633 | }, 1634 | "strip-ansi": { 1635 | "version": "5.2.0", 1636 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 1637 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 1638 | "dev": true, 1639 | "requires": { 1640 | "ansi-regex": "^4.1.0" 1641 | } 1642 | } 1643 | } 1644 | }, 1645 | "yargs-parser": { 1646 | "version": "13.1.1", 1647 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", 1648 | "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", 1649 | "dev": true, 1650 | "requires": { 1651 | "camelcase": "^5.0.0", 1652 | "decamelize": "^1.2.0" 1653 | }, 1654 | "dependencies": { 1655 | "camelcase": { 1656 | "version": "5.3.1", 1657 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", 1658 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", 1659 | "dev": true 1660 | } 1661 | } 1662 | } 1663 | } 1664 | } 1665 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vuejs-slack-clone", 3 | "version": "0.0.0", 4 | "private": true, 5 | "scripts": { 6 | "dev:server": "nodemon ./bin/www", 7 | "dev:client": "cd client && npm run serve", 8 | "dev": "concurrently --kill-others-on-fail 'npm run dev:server' 'npm run dev:client'", 9 | "start": "node ./bin/www" 10 | }, 11 | "dependencies": { 12 | "cookie-parser": "~1.4.4", 13 | "debug": "~2.6.9", 14 | "dotenv": "^8.2.0", 15 | "express": "~4.16.1", 16 | "morgan": "~1.9.1" 17 | }, 18 | "devDependencies": { 19 | "concurrently": "^5.1.0", 20 | "nodemon": "^2.0.2" 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Express 5 | 6 | 7 | 8 | 9 |

Express

10 |

Welcome to Express

11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /public/stylesheets/style.css: -------------------------------------------------------------------------------- 1 | body { 2 | padding: 50px; 3 | font: 14px "Lucida Grande", Helvetica, Arial, sans-serif; 4 | } 5 | 6 | a { 7 | color: #00B7FF; 8 | } 9 | -------------------------------------------------------------------------------- /routes/server.js: -------------------------------------------------------------------------------- 1 | // routes/server.js 2 | var express = require('express'); 3 | var router = express.Router(); 4 | 5 | var serverController = require('../controllers/server'); 6 | 7 | router.get('/status', serverController.status); 8 | 9 | module.exports = router; -------------------------------------------------------------------------------- /routes/user.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const router = express.Router(); 3 | 4 | const userController = require('../controllers/user'); 5 | 6 | router.get('/session', userController.session); 7 | 8 | module.exports = router; -------------------------------------------------------------------------------- /vonage_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nexmo-community/vuejs-slack-clone/9fdd28345e9b9a70747a0d56c1ab019a31c1dbc0/vonage_logo.png --------------------------------------------------------------------------------