├── README.md
├── TODO.md
├── client
├── .browserslistrc
├── .editorconfig
├── .eslintrc.js
├── .gitignore
├── README.md
├── babel.config.js
├── package-lock.json
├── package.json
├── pnpm-lock.yaml
├── postcss.config.js
├── public
│ ├── favicon.ico
│ ├── img
│ │ ├── discord.png
│ │ ├── discord2.jpg
│ │ ├── logo.png
│ │ ├── twitch.jpg
│ │ ├── twitch2.jpg
│ │ ├── twitch3.jpg
│ │ └── youtube.jpg
│ └── index.html
└── src
│ ├── App.vue
│ ├── assets
│ └── logo.svg
│ ├── components
│ └── Message.vue
│ ├── main.js
│ ├── plugins
│ └── vuetify.js
│ ├── router.js
│ ├── store.js
│ └── views
│ ├── Chat.vue
│ ├── Home.vue
│ └── LiveChat.vue
├── package-lock.json
└── server
├── .env.sample
├── .eslintrc.js
├── .gitignore
├── .vscode
└── launch.json
├── greetings.md
├── package-lock.json
├── package.json
├── pnpm-lock.yaml
├── public
└── callback.html
└── src
├── followMessages.js
├── index.js
├── routes
└── index.js
└── socket.js
/README.md:
--------------------------------------------------------------------------------
1 | # Live Chat Manager
2 |
3 | # THE SERVER CODE IS FULL OF COMMENTED OUT CODE SINCE I DO NOT STREAM ON YOUTUBE ANYMORE
4 | # THIS REPO WILL SOON BE DEPRECATED FOR A TWITCH ONLY SERVER
5 |
6 | A dashboard that allows me to manage incoming chat messages from YouTube and Twitch.
7 |
8 | ## Setup
9 |
10 | ### Server
11 |
12 | ```sh
13 | cd server
14 | npm install
15 | cp .env.sample .env #update .env
16 | npm run dev
17 | ```
18 |
19 | #### Server Environment Variables
20 |
21 | | Variable | Example | Description |
22 | | - |:-:| -:|
23 | | GOOGLE_API_KEY | abc123 | Google API Key to retrieve streams and chat messages from YouTube API |
24 | | TWITCH_CLIENT_ID | abc123 | Twitch Client ID to retrieve twitch user images from Twitch API |
25 | | YOUTUBE_CHANNEL_ID | UCLNgu_OupwoeESgtab33CCw | YouTube channel ID to list streams for |
26 | | TWITCH_CHANNEL | #codinggarden | Twitch channel to listen for messages on |
27 | | TWITCH_TOKEN | abc123 | Twitch oauth token with permission to listen to channel points pub sub events
28 |
29 | ### Client
30 |
31 | ```sh
32 | cd client
33 | npm install
34 | npm run serve
35 | ```
36 |
--------------------------------------------------------------------------------
/TODO.md:
--------------------------------------------------------------------------------
1 | ## Cleanup
2 |
3 | * [x] Upgrade dependencies
4 | * [x] Get the current event chat id
5 | * [x] List out live events for channel
6 |
7 | ## Features
8 |
9 | * [ ] Purify and markdown render messages on the server!
10 | * [x] How many chat messages acknowledge vs need to acknowledge
11 | * [ ] Send a message...
12 | * [x] Search chat messages
13 | * [x] Label messages
14 | * Question
15 | * Hello / Hi
16 | * welcome,questions,suggestions,other conversations
17 | * [ ] Allow upvotes on chat messages
18 | * [ ] Bot auto answers questions
19 | * [ ] Discord chat integration
20 | - chats intermingled with youtube chat
21 | * [ ] Label messages from mods
22 | * [ ] group messages by user
23 | * [x] Show timestamp on messages
24 | * [ ] offline watch w/ live chat
25 | * [ ] button for marking all messages as acknowledge
26 | * [x] Allow markdown in chat message
27 |
--------------------------------------------------------------------------------
/client/.browserslistrc:
--------------------------------------------------------------------------------
1 | > 1%
2 | last 2 versions
3 |
4 | not ie <= 10
--------------------------------------------------------------------------------
/client/.editorconfig:
--------------------------------------------------------------------------------
1 | [*.{js,jsx,ts,tsx,vue}]
2 | indent_style = space
3 | indent_size = 2
4 | end_of_line = lf
5 | trim_trailing_whitespace = true
6 | insert_final_newline = true
7 | max_line_length = 100
8 |
--------------------------------------------------------------------------------
/client/.eslintrc.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | root: true,
3 | env: {
4 | node: true,
5 | },
6 | extends: [
7 | 'plugin:vue/essential',
8 | '@vue/airbnb',
9 | ],
10 | rules: {
11 | 'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off',
12 | 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off',
13 | 'no-param-reassign': 0,
14 | 'consistent-return': 0,
15 | 'array-callback-return': 0,
16 | 'no-self-assign': 0,
17 | },
18 | parserOptions: {
19 | parser: 'babel-eslint',
20 | },
21 | };
22 |
--------------------------------------------------------------------------------
/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-v2
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 | ### Run your tests
19 | ```
20 | npm run test
21 | ```
22 |
23 | ### Lints and fixes files
24 | ```
25 | npm run lint
26 | ```
27 |
28 | ### Customize configuration
29 | See [Configuration Reference](https://cli.vuejs.org/config/).
30 |
--------------------------------------------------------------------------------
/client/babel.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | presets: [
3 | [
4 | '@vue/app',
5 | {
6 | useBuiltIns: 'entry',
7 | },
8 | ],
9 | ],
10 | };
11 |
--------------------------------------------------------------------------------
/client/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "client-v2",
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 | "@babel/polyfill": "^7.8.7",
12 | "core-js": "^3.6.5",
13 | "dompurify": "^2.0.11",
14 | "marked": "^1.1.0",
15 | "socket.io-client": "^2.3.0",
16 | "timeago.js": "^4.0.2",
17 | "vue": "^2.6.11",
18 | "vue-router": "^3.2.0",
19 | "vuetify": "^2.2.29",
20 | "vuex": "^3.4.0"
21 | },
22 | "devDependencies": {
23 | "@vue/cli-plugin-babel": "^4.3.1",
24 | "@vue/cli-plugin-eslint": "^4.3.1",
25 | "@vue/cli-service": "^4.3.1",
26 | "@vue/eslint-config-airbnb": "^5.0.2",
27 | "babel-eslint": "^10.1.0",
28 | "babel-loader": "^8.1.0",
29 | "eslint": "^7.1.0",
30 | "eslint-plugin-vue": "^6.2.2",
31 | "lint-staged": "^10.2.6",
32 | "sass": "^1.26.5",
33 | "sass-loader": "^8.0.2",
34 | "vue-cli-plugin-vuetify": "^2.0.5",
35 | "vue-template-compiler": "^2.6.11"
36 | },
37 | "gitHooks": {
38 | "pre-commit": "lint-staged"
39 | },
40 | "lint-staged": {
41 | "*.{js,vue}": [
42 | "vue-cli-service lint",
43 | "git add"
44 | ]
45 | }
46 | }
47 |
--------------------------------------------------------------------------------
/client/postcss.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | plugins: {
3 | autoprefixer: {},
4 | },
5 | };
6 |
--------------------------------------------------------------------------------
/client/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CodingGarden/live-chat-manager/212676e0dccd69846b132a924d094ad66ffa8d55/client/public/favicon.ico
--------------------------------------------------------------------------------
/client/public/img/discord.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CodingGarden/live-chat-manager/212676e0dccd69846b132a924d094ad66ffa8d55/client/public/img/discord.png
--------------------------------------------------------------------------------
/client/public/img/discord2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CodingGarden/live-chat-manager/212676e0dccd69846b132a924d094ad66ffa8d55/client/public/img/discord2.jpg
--------------------------------------------------------------------------------
/client/public/img/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CodingGarden/live-chat-manager/212676e0dccd69846b132a924d094ad66ffa8d55/client/public/img/logo.png
--------------------------------------------------------------------------------
/client/public/img/twitch.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CodingGarden/live-chat-manager/212676e0dccd69846b132a924d094ad66ffa8d55/client/public/img/twitch.jpg
--------------------------------------------------------------------------------
/client/public/img/twitch2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CodingGarden/live-chat-manager/212676e0dccd69846b132a924d094ad66ffa8d55/client/public/img/twitch2.jpg
--------------------------------------------------------------------------------
/client/public/img/twitch3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CodingGarden/live-chat-manager/212676e0dccd69846b132a924d094ad66ffa8d55/client/public/img/twitch3.jpg
--------------------------------------------------------------------------------
/client/public/img/youtube.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CodingGarden/live-chat-manager/212676e0dccd69846b132a924d094ad66ffa8d55/client/public/img/youtube.jpg
--------------------------------------------------------------------------------
/client/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | client-v2
9 |
10 |
11 |
12 |
13 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/client/src/App.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
26 |
27 |
36 |
--------------------------------------------------------------------------------
/client/src/assets/logo.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/client/src/components/Message.vue:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
![]()
9 |
{{author.displayName}}
10 |
11 |
12 |
13 |
{{message.message}}
14 |
15 |
16 |
17 | mdi-parking
18 |
19 |
20 | mdi-checkbox-marked
21 |
22 |
23 |
24 |
25 | mdi-xml
26 |
27 |
28 |
{{published}}
29 |
30 |
31 |
32 |
93 |
94 |
157 |
--------------------------------------------------------------------------------
/client/src/main.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue';
2 | import App from './App.vue';
3 | import router from './router';
4 | import store from './store';
5 | import vuetify from './plugins/vuetify';
6 | import '@babel/polyfill';
7 |
8 | Vue.config.productionTip = false;
9 |
10 | new Vue({
11 | router,
12 | store,
13 | vuetify,
14 | render: (h) => h(App),
15 | }).$mount('#app');
16 |
--------------------------------------------------------------------------------
/client/src/plugins/vuetify.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue';
2 | import Vuetify from 'vuetify';
3 | import 'vuetify/dist/vuetify.min.css';
4 |
5 | Vue.use(Vuetify);
6 |
7 | export default new Vuetify({
8 | icons: {
9 | iconfont: 'mdi',
10 | },
11 | });
12 |
--------------------------------------------------------------------------------
/client/src/router.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue';
2 | import Router from 'vue-router';
3 | import Home from './views/Home.vue';
4 | import Chat from './views/Chat.vue';
5 | import LiveChat from './views/LiveChat.vue';
6 |
7 | Vue.use(Router);
8 |
9 | export default new Router({
10 | routes: [
11 | {
12 | path: '/',
13 | name: 'home',
14 | component: Home,
15 | },
16 | {
17 | path: '/chat/:id',
18 | name: 'chat',
19 | component: Chat,
20 | },
21 | {
22 | path: '/chat/:id/live',
23 | name: 'live-chat',
24 | component: LiveChat,
25 | },
26 | ],
27 | });
28 |
--------------------------------------------------------------------------------
/client/src/store.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue';
2 | import Vuex from 'vuex';
3 |
4 | Vue.use(Vuex);
5 |
6 | export default new Vuex.Store({
7 | state: {
8 |
9 | },
10 | mutations: {
11 |
12 | },
13 | actions: {
14 |
15 | },
16 | });
17 |
--------------------------------------------------------------------------------
/client/src/views/Chat.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 | Messages
11 |
12 |
13 | {{unAckMessages.length}}
14 | mdi-message-text
15 |
16 |
17 |
18 |
19 |
20 |
21 | Greetings
22 |
23 |
24 | {{greetingMessages.length}}
25 | mdi-human-greeting
26 |
27 |
28 |
29 |
30 |
31 |
32 | Follows
33 |
34 |
35 | {{followMessages.length}}
36 | mdi-heart
37 |
38 |
39 |
40 |
41 |
42 |
43 | Parking Lot
44 |
45 |
46 | {{offTopicMessages.length}}
47 | mdi-parking
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
68 |
69 |
70 |
71 |
72 |
82 |
83 |
84 |
85 |
86 |
96 |
97 |
98 |
99 |
100 |
110 |
111 |
112 |
113 |
114 |
127 |
128 |
129 |
130 |
131 |
238 |
239 |
322 |
--------------------------------------------------------------------------------
/client/src/views/Home.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
9 |
14 | {{event.snippet.title}}
15 |
16 |
17 |
18 |
28 | View Live Chat
29 |
30 |
31 |
32 |
33 |
34 |
35 |
49 |
--------------------------------------------------------------------------------
/client/src/views/LiveChat.vue:
--------------------------------------------------------------------------------
1 |
2 |
20 |
21 |
22 |
105 |
106 |
176 |
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "lockfileVersion": 1
3 | }
4 |
--------------------------------------------------------------------------------
/server/.env.sample:
--------------------------------------------------------------------------------
1 | GOOGLE_API_KEY=
2 | TWITCH_CLIENT_ID=
3 | YOUTUBE_CHANNEL_ID=UCLNgu_OupwoeESgtab33CCw
4 | TWITCH_CHANNEL=#codinggarden
5 | TWITCH_TOKEN=abc123
--------------------------------------------------------------------------------
/server/.eslintrc.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | env: {
3 | commonjs: true,
4 | es6: true,
5 | node: true,
6 | },
7 | extends: [
8 | 'airbnb-base',
9 | ],
10 | globals: {
11 | Atomics: 'readonly',
12 | SharedArrayBuffer: 'readonly',
13 | },
14 | parserOptions: {
15 | ecmaVersion: 2018,
16 | },
17 | rules: {
18 | 'no-param-reassign': 0,
19 | 'no-await-in-loop': 0,
20 | 'no-underscore-dangle': 0,
21 | 'no-plusplus': 0,
22 | 'camelcase': 0,
23 | },
24 | };
25 |
--------------------------------------------------------------------------------
/server/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | lerna-debug.log*
8 |
9 | # Diagnostic reports (https://nodejs.org/api/report.html)
10 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
11 |
12 | # Runtime data
13 | pids
14 | *.pid
15 | *.seed
16 | *.pid.lock
17 |
18 | # Directory for instrumented libs generated by jscoverage/JSCover
19 | lib-cov
20 |
21 | # Coverage directory used by tools like istanbul
22 | coverage
23 | *.lcov
24 |
25 | # nyc test coverage
26 | .nyc_output
27 |
28 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
29 | .grunt
30 |
31 | # Bower dependency directory (https://bower.io/)
32 | bower_components
33 |
34 | # node-waf configuration
35 | .lock-wscript
36 |
37 | # Compiled binary addons (https://nodejs.org/api/addons.html)
38 | build/Release
39 |
40 | # Dependency directories
41 | node_modules/
42 | jspm_packages/
43 |
44 | # TypeScript v1 declaration files
45 | typings/
46 |
47 | # TypeScript cache
48 | *.tsbuildinfo
49 |
50 | # Optional npm cache directory
51 | .npm
52 |
53 | # Optional eslint cache
54 | .eslintcache
55 |
56 | # Optional REPL history
57 | .node_repl_history
58 |
59 | # Output of 'npm pack'
60 | *.tgz
61 |
62 | # Yarn Integrity file
63 | .yarn-integrity
64 |
65 | # dotenv environment variables file
66 | .env
67 | .env.test
68 |
69 | # parcel-bundler cache (https://parceljs.org/)
70 | .cache
71 |
72 | # next.js build output
73 | .next
74 |
75 | # nuxt.js build output
76 | .nuxt
77 |
78 | # vuepress build output
79 | .vuepress/dist
80 |
81 | # Serverless directories
82 | .serverless/
83 |
84 | # FuseBox cache
85 | .fusebox/
86 |
87 | # DynamoDB Local files
88 | .dynamodb/
89 |
--------------------------------------------------------------------------------
/server/.vscode/launch.json:
--------------------------------------------------------------------------------
1 | {
2 | // Use IntelliSense to learn about possible attributes.
3 | // Hover to view descriptions of existing attributes.
4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
5 | "version": "0.2.0",
6 | "configurations": [
7 | {
8 | "type": "node",
9 | "request": "launch",
10 | "name": "Launch Program",
11 | "program": "${workspaceFolder}/src/index.js"
12 | }
13 | ]
14 | }
--------------------------------------------------------------------------------
/server/greetings.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CodingGarden/live-chat-manager/212676e0dccd69846b132a924d094ad66ffa8d55/server/greetings.md
--------------------------------------------------------------------------------
/server/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "server",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "start": "node src/index.js",
8 | "dev": "nodemon src/index.js",
9 | "lint": "eslint src/"
10 | },
11 | "keywords": [],
12 | "author": "w3cj ",
13 | "license": "MIT",
14 | "dependencies": {
15 | "bad-words": "^3.0.3",
16 | "cors": "^2.8.5",
17 | "dotenv": "^8.2.0",
18 | "express": "^4.17.1",
19 | "monk": "^7.3.0",
20 | "morgan": "^1.10.0",
21 | "node-fetch": "^2.6.0",
22 | "socket.io": "^2.3.0",
23 | "tmi.js": "^1.5.0",
24 | "twitchps": "^1.5.0"
25 | },
26 | "devDependencies": {
27 | "eslint": "^7.0.0",
28 | "eslint-config-airbnb-base": "^14.1.0",
29 | "eslint-plugin-import": "^2.20.2",
30 | "nodemon": "^2.0.4"
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/server/pnpm-lock.yaml:
--------------------------------------------------------------------------------
1 | dependencies:
2 | cors: 2.8.5
3 | dotenv: 8.1.0
4 | express: 4.17.1
5 | morgan: 1.9.1
6 | node-fetch: 2.6.0
7 | passport: 0.4.0
8 | passport-google-oauth20: 2.0.0
9 | socket.io: 2.3.0
10 | devDependencies:
11 | eslint: 6.4.0
12 | eslint-config-airbnb-base: 14.0.0_a5075551116d142daa65813c845087dd
13 | eslint-plugin-import: 2.18.2_eslint@6.4.0
14 | nodemon: 1.19.2
15 | lockfileVersion: 5.1
16 | packages:
17 | /@babel/code-frame/7.5.5:
18 | dependencies:
19 | '@babel/highlight': 7.5.0
20 | dev: true
21 | resolution:
22 | integrity: sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==
23 | /@babel/highlight/7.5.0:
24 | dependencies:
25 | chalk: 2.4.2
26 | esutils: 2.0.3
27 | js-tokens: 4.0.0
28 | dev: true
29 | resolution:
30 | integrity: sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==
31 | /abbrev/1.1.1:
32 | dev: true
33 | resolution:
34 | integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==
35 | /accepts/1.3.7:
36 | dependencies:
37 | mime-types: 2.1.24
38 | negotiator: 0.6.2
39 | dev: false
40 | engines:
41 | node: '>= 0.6'
42 | resolution:
43 | integrity: sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==
44 | /acorn-jsx/5.0.2_acorn@7.1.0:
45 | dependencies:
46 | acorn: 7.1.0
47 | dev: true
48 | peerDependencies:
49 | acorn: ^6.0.0 || ^7.0.0
50 | resolution:
51 | integrity: sha512-tiNTrP1MP0QrChmD2DdupCr6HWSFeKVw5d/dHTu4Y7rkAkRhU/Dt7dphAfIUyxtHpl/eBVip5uTNSpQJHylpAw==
52 | /acorn/7.1.0:
53 | dev: true
54 | engines:
55 | node: '>=0.4.0'
56 | hasBin: true
57 | resolution:
58 | integrity: sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==
59 | /after/0.8.2:
60 | dev: false
61 | resolution:
62 | integrity: sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=
63 | /ajv/6.10.2:
64 | dependencies:
65 | fast-deep-equal: 2.0.1
66 | fast-json-stable-stringify: 2.0.0
67 | json-schema-traverse: 0.4.1
68 | uri-js: 4.2.2
69 | dev: true
70 | resolution:
71 | integrity: sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==
72 | /ansi-align/2.0.0:
73 | dependencies:
74 | string-width: 2.1.1
75 | dev: true
76 | resolution:
77 | integrity: sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=
78 | /ansi-escapes/3.2.0:
79 | dev: true
80 | engines:
81 | node: '>=4'
82 | resolution:
83 | integrity: sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==
84 | /ansi-regex/3.0.0:
85 | dev: true
86 | engines:
87 | node: '>=4'
88 | resolution:
89 | integrity: sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=
90 | /ansi-regex/4.1.0:
91 | dev: true
92 | engines:
93 | node: '>=6'
94 | resolution:
95 | integrity: sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==
96 | /ansi-styles/3.2.1:
97 | dependencies:
98 | color-convert: 1.9.3
99 | dev: true
100 | engines:
101 | node: '>=4'
102 | resolution:
103 | integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
104 | /anymatch/2.0.0:
105 | dependencies:
106 | micromatch: 3.1.10
107 | normalize-path: 2.1.1
108 | dev: true
109 | resolution:
110 | integrity: sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==
111 | /argparse/1.0.10:
112 | dependencies:
113 | sprintf-js: 1.0.3
114 | dev: true
115 | resolution:
116 | integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==
117 | /arr-diff/4.0.0:
118 | dev: true
119 | engines:
120 | node: '>=0.10.0'
121 | resolution:
122 | integrity: sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=
123 | /arr-flatten/1.1.0:
124 | dev: true
125 | engines:
126 | node: '>=0.10.0'
127 | resolution:
128 | integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==
129 | /arr-union/3.1.0:
130 | dev: true
131 | engines:
132 | node: '>=0.10.0'
133 | resolution:
134 | integrity: sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=
135 | /array-flatten/1.1.1:
136 | dev: false
137 | resolution:
138 | integrity: sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=
139 | /array-includes/3.0.3:
140 | dependencies:
141 | define-properties: 1.1.3
142 | es-abstract: 1.14.2
143 | dev: true
144 | engines:
145 | node: '>= 0.4'
146 | resolution:
147 | integrity: sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=
148 | /array-unique/0.3.2:
149 | dev: true
150 | engines:
151 | node: '>=0.10.0'
152 | resolution:
153 | integrity: sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=
154 | /arraybuffer.slice/0.0.7:
155 | dev: false
156 | resolution:
157 | integrity: sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==
158 | /assign-symbols/1.0.0:
159 | dev: true
160 | engines:
161 | node: '>=0.10.0'
162 | resolution:
163 | integrity: sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=
164 | /astral-regex/1.0.0:
165 | dev: true
166 | engines:
167 | node: '>=4'
168 | resolution:
169 | integrity: sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==
170 | /async-each/1.0.3:
171 | dev: true
172 | resolution:
173 | integrity: sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==
174 | /async-limiter/1.0.1:
175 | dev: false
176 | resolution:
177 | integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==
178 | /atob/2.1.2:
179 | dev: true
180 | engines:
181 | node: '>= 4.5.0'
182 | hasBin: true
183 | resolution:
184 | integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==
185 | /backo2/1.0.2:
186 | dev: false
187 | resolution:
188 | integrity: sha1-MasayLEpNjRj41s+u2n038+6eUc=
189 | /balanced-match/1.0.0:
190 | dev: true
191 | resolution:
192 | integrity: sha1-ibTRmasr7kneFk6gK4nORi1xt2c=
193 | /base/0.11.2:
194 | dependencies:
195 | cache-base: 1.0.1
196 | class-utils: 0.3.6
197 | component-emitter: 1.3.0
198 | define-property: 1.0.0
199 | isobject: 3.0.1
200 | mixin-deep: 1.3.2
201 | pascalcase: 0.1.1
202 | dev: true
203 | engines:
204 | node: '>=0.10.0'
205 | resolution:
206 | integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==
207 | /base64-arraybuffer/0.1.5:
208 | dev: false
209 | engines:
210 | node: '>= 0.6.0'
211 | resolution:
212 | integrity: sha1-c5JncZI7Whl0etZmqlzUv5xunOg=
213 | /base64id/2.0.0:
214 | dev: false
215 | engines:
216 | node: ^4.5.0 || >= 5.9
217 | resolution:
218 | integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==
219 | /base64url/3.0.1:
220 | dev: false
221 | engines:
222 | node: '>=6.0.0'
223 | resolution:
224 | integrity: sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==
225 | /basic-auth/2.0.1:
226 | dependencies:
227 | safe-buffer: 5.1.2
228 | dev: false
229 | engines:
230 | node: '>= 0.8'
231 | resolution:
232 | integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==
233 | /better-assert/1.0.2:
234 | dependencies:
235 | callsite: 1.0.0
236 | dev: false
237 | resolution:
238 | integrity: sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=
239 | /binary-extensions/1.13.1:
240 | dev: true
241 | engines:
242 | node: '>=0.10.0'
243 | resolution:
244 | integrity: sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==
245 | /blob/0.0.5:
246 | dev: false
247 | resolution:
248 | integrity: sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==
249 | /body-parser/1.19.0:
250 | dependencies:
251 | bytes: 3.1.0
252 | content-type: 1.0.4
253 | debug: 2.6.9
254 | depd: 1.1.2
255 | http-errors: 1.7.2
256 | iconv-lite: 0.4.24
257 | on-finished: 2.3.0
258 | qs: 6.7.0
259 | raw-body: 2.4.0
260 | type-is: 1.6.18
261 | dev: false
262 | engines:
263 | node: '>= 0.8'
264 | resolution:
265 | integrity: sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==
266 | /boxen/1.3.0:
267 | dependencies:
268 | ansi-align: 2.0.0
269 | camelcase: 4.1.0
270 | chalk: 2.4.2
271 | cli-boxes: 1.0.0
272 | string-width: 2.1.1
273 | term-size: 1.2.0
274 | widest-line: 2.0.1
275 | dev: true
276 | engines:
277 | node: '>=4'
278 | resolution:
279 | integrity: sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==
280 | /brace-expansion/1.1.11:
281 | dependencies:
282 | balanced-match: 1.0.0
283 | concat-map: 0.0.1
284 | dev: true
285 | resolution:
286 | integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
287 | /braces/2.3.2:
288 | dependencies:
289 | arr-flatten: 1.1.0
290 | array-unique: 0.3.2
291 | extend-shallow: 2.0.1
292 | fill-range: 4.0.0
293 | isobject: 3.0.1
294 | repeat-element: 1.1.3
295 | snapdragon: 0.8.2
296 | snapdragon-node: 2.1.1
297 | split-string: 3.1.0
298 | to-regex: 3.0.2
299 | dev: true
300 | engines:
301 | node: '>=0.10.0'
302 | resolution:
303 | integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==
304 | /bytes/3.1.0:
305 | dev: false
306 | engines:
307 | node: '>= 0.8'
308 | resolution:
309 | integrity: sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==
310 | /cache-base/1.0.1:
311 | dependencies:
312 | collection-visit: 1.0.0
313 | component-emitter: 1.3.0
314 | get-value: 2.0.6
315 | has-value: 1.0.0
316 | isobject: 3.0.1
317 | set-value: 2.0.1
318 | to-object-path: 0.3.0
319 | union-value: 1.0.1
320 | unset-value: 1.0.0
321 | dev: true
322 | engines:
323 | node: '>=0.10.0'
324 | resolution:
325 | integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==
326 | /callsite/1.0.0:
327 | dev: false
328 | resolution:
329 | integrity: sha1-KAOY5dZkvXQDi28JBRU+borxvCA=
330 | /callsites/3.1.0:
331 | dev: true
332 | engines:
333 | node: '>=6'
334 | resolution:
335 | integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
336 | /camelcase/4.1.0:
337 | dev: true
338 | engines:
339 | node: '>=4'
340 | resolution:
341 | integrity: sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=
342 | /capture-stack-trace/1.0.1:
343 | dev: true
344 | engines:
345 | node: '>=0.10.0'
346 | resolution:
347 | integrity: sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==
348 | /chalk/2.4.2:
349 | dependencies:
350 | ansi-styles: 3.2.1
351 | escape-string-regexp: 1.0.5
352 | supports-color: 5.5.0
353 | dev: true
354 | engines:
355 | node: '>=4'
356 | resolution:
357 | integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
358 | /chardet/0.7.0:
359 | dev: true
360 | resolution:
361 | integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==
362 | /chokidar/2.1.8:
363 | dependencies:
364 | anymatch: 2.0.0
365 | async-each: 1.0.3
366 | braces: 2.3.2
367 | glob-parent: 3.1.0
368 | inherits: 2.0.4
369 | is-binary-path: 1.0.1
370 | is-glob: 4.0.1
371 | normalize-path: 3.0.0
372 | path-is-absolute: 1.0.1
373 | readdirp: 2.2.1
374 | upath: 1.2.0
375 | dev: true
376 | optionalDependencies:
377 | fsevents: 1.2.9
378 | resolution:
379 | integrity: sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==
380 | /ci-info/1.6.0:
381 | dev: true
382 | resolution:
383 | integrity: sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==
384 | /class-utils/0.3.6:
385 | dependencies:
386 | arr-union: 3.1.0
387 | define-property: 0.2.5
388 | isobject: 3.0.1
389 | static-extend: 0.1.2
390 | dev: true
391 | engines:
392 | node: '>=0.10.0'
393 | resolution:
394 | integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==
395 | /cli-boxes/1.0.0:
396 | dev: true
397 | engines:
398 | node: '>=0.10.0'
399 | resolution:
400 | integrity: sha1-T6kXw+WclKAEzWH47lCdplFocUM=
401 | /cli-cursor/2.1.0:
402 | dependencies:
403 | restore-cursor: 2.0.0
404 | dev: true
405 | engines:
406 | node: '>=4'
407 | resolution:
408 | integrity: sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=
409 | /cli-width/2.2.0:
410 | dev: true
411 | resolution:
412 | integrity: sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=
413 | /collection-visit/1.0.0:
414 | dependencies:
415 | map-visit: 1.0.0
416 | object-visit: 1.0.1
417 | dev: true
418 | engines:
419 | node: '>=0.10.0'
420 | resolution:
421 | integrity: sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=
422 | /color-convert/1.9.3:
423 | dependencies:
424 | color-name: 1.1.3
425 | dev: true
426 | resolution:
427 | integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
428 | /color-name/1.1.3:
429 | dev: true
430 | resolution:
431 | integrity: sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
432 | /component-bind/1.0.0:
433 | dev: false
434 | resolution:
435 | integrity: sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=
436 | /component-emitter/1.2.1:
437 | dev: false
438 | resolution:
439 | integrity: sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=
440 | /component-emitter/1.3.0:
441 | dev: true
442 | resolution:
443 | integrity: sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==
444 | /component-inherit/0.0.3:
445 | dev: false
446 | resolution:
447 | integrity: sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=
448 | /concat-map/0.0.1:
449 | dev: true
450 | resolution:
451 | integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
452 | /configstore/3.1.2:
453 | dependencies:
454 | dot-prop: 4.2.0
455 | graceful-fs: 4.2.2
456 | make-dir: 1.3.0
457 | unique-string: 1.0.0
458 | write-file-atomic: 2.4.3
459 | xdg-basedir: 3.0.0
460 | dev: true
461 | engines:
462 | node: '>=4'
463 | resolution:
464 | integrity: sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==
465 | /confusing-browser-globals/1.0.9:
466 | dev: true
467 | resolution:
468 | integrity: sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw==
469 | /contains-path/0.1.0:
470 | dev: true
471 | engines:
472 | node: '>=0.10.0'
473 | resolution:
474 | integrity: sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=
475 | /content-disposition/0.5.3:
476 | dependencies:
477 | safe-buffer: 5.1.2
478 | dev: false
479 | engines:
480 | node: '>= 0.6'
481 | resolution:
482 | integrity: sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==
483 | /content-type/1.0.4:
484 | dev: false
485 | engines:
486 | node: '>= 0.6'
487 | resolution:
488 | integrity: sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==
489 | /cookie-signature/1.0.6:
490 | dev: false
491 | resolution:
492 | integrity: sha1-4wOogrNCzD7oylE6eZmXNNqzriw=
493 | /cookie/0.3.1:
494 | dev: false
495 | engines:
496 | node: '>= 0.6'
497 | resolution:
498 | integrity: sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=
499 | /cookie/0.4.0:
500 | dev: false
501 | engines:
502 | node: '>= 0.6'
503 | resolution:
504 | integrity: sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==
505 | /copy-descriptor/0.1.1:
506 | dev: true
507 | engines:
508 | node: '>=0.10.0'
509 | resolution:
510 | integrity: sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=
511 | /core-util-is/1.0.2:
512 | dev: true
513 | resolution:
514 | integrity: sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
515 | /cors/2.8.5:
516 | dependencies:
517 | object-assign: 4.1.1
518 | vary: 1.1.2
519 | dev: false
520 | engines:
521 | node: '>= 0.10'
522 | resolution:
523 | integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==
524 | /create-error-class/3.0.2:
525 | dependencies:
526 | capture-stack-trace: 1.0.1
527 | dev: true
528 | engines:
529 | node: '>=0.10.0'
530 | resolution:
531 | integrity: sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=
532 | /cross-spawn/5.1.0:
533 | dependencies:
534 | lru-cache: 4.1.5
535 | shebang-command: 1.2.0
536 | which: 1.3.1
537 | dev: true
538 | resolution:
539 | integrity: sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=
540 | /cross-spawn/6.0.5:
541 | dependencies:
542 | nice-try: 1.0.5
543 | path-key: 2.0.1
544 | semver: 5.7.1
545 | shebang-command: 1.2.0
546 | which: 1.3.1
547 | dev: true
548 | engines:
549 | node: '>=4.8'
550 | resolution:
551 | integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==
552 | /crypto-random-string/1.0.0:
553 | dev: true
554 | engines:
555 | node: '>=4'
556 | resolution:
557 | integrity: sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=
558 | /debug/2.6.9:
559 | dependencies:
560 | ms: 2.0.0
561 | resolution:
562 | integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
563 | /debug/3.1.0:
564 | dependencies:
565 | ms: 2.0.0
566 | dev: false
567 | resolution:
568 | integrity: sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==
569 | /debug/3.2.6:
570 | dependencies:
571 | ms: 2.1.2
572 | dev: true
573 | resolution:
574 | integrity: sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==
575 | /debug/4.1.1:
576 | dependencies:
577 | ms: 2.1.2
578 | resolution:
579 | integrity: sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==
580 | /decode-uri-component/0.2.0:
581 | dev: true
582 | engines:
583 | node: '>=0.10'
584 | resolution:
585 | integrity: sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=
586 | /deep-extend/0.6.0:
587 | dev: true
588 | engines:
589 | node: '>=4.0.0'
590 | resolution:
591 | integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==
592 | /deep-is/0.1.3:
593 | dev: true
594 | resolution:
595 | integrity: sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=
596 | /define-properties/1.1.3:
597 | dependencies:
598 | object-keys: 1.1.1
599 | dev: true
600 | engines:
601 | node: '>= 0.4'
602 | resolution:
603 | integrity: sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==
604 | /define-property/0.2.5:
605 | dependencies:
606 | is-descriptor: 0.1.6
607 | dev: true
608 | engines:
609 | node: '>=0.10.0'
610 | resolution:
611 | integrity: sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=
612 | /define-property/1.0.0:
613 | dependencies:
614 | is-descriptor: 1.0.2
615 | dev: true
616 | engines:
617 | node: '>=0.10.0'
618 | resolution:
619 | integrity: sha1-dp66rz9KY6rTr56NMEybvnm/sOY=
620 | /define-property/2.0.2:
621 | dependencies:
622 | is-descriptor: 1.0.2
623 | isobject: 3.0.1
624 | dev: true
625 | engines:
626 | node: '>=0.10.0'
627 | resolution:
628 | integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==
629 | /depd/1.1.2:
630 | dev: false
631 | engines:
632 | node: '>= 0.6'
633 | resolution:
634 | integrity: sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=
635 | /destroy/1.0.4:
636 | dev: false
637 | resolution:
638 | integrity: sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=
639 | /doctrine/1.5.0:
640 | dependencies:
641 | esutils: 2.0.3
642 | isarray: 1.0.0
643 | dev: true
644 | engines:
645 | node: '>=0.10.0'
646 | resolution:
647 | integrity: sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=
648 | /doctrine/3.0.0:
649 | dependencies:
650 | esutils: 2.0.3
651 | dev: true
652 | engines:
653 | node: '>=6.0.0'
654 | resolution:
655 | integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==
656 | /dot-prop/4.2.0:
657 | dependencies:
658 | is-obj: 1.0.1
659 | dev: true
660 | engines:
661 | node: '>=4'
662 | resolution:
663 | integrity: sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==
664 | /dotenv/8.1.0:
665 | dev: false
666 | engines:
667 | node: '>=8'
668 | resolution:
669 | integrity: sha512-GUE3gqcDCaMltj2++g6bRQ5rBJWtkWTmqmD0fo1RnnMuUqHNCt2oTPeDnS9n6fKYvlhn7AeBkb38lymBtWBQdA==
670 | /duplexer3/0.1.4:
671 | dev: true
672 | resolution:
673 | integrity: sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=
674 | /ee-first/1.1.1:
675 | dev: false
676 | resolution:
677 | integrity: sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
678 | /emoji-regex/7.0.3:
679 | dev: true
680 | resolution:
681 | integrity: sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==
682 | /encodeurl/1.0.2:
683 | dev: false
684 | engines:
685 | node: '>= 0.8'
686 | resolution:
687 | integrity: sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=
688 | /engine.io-client/3.4.0:
689 | dependencies:
690 | component-emitter: 1.2.1
691 | component-inherit: 0.0.3
692 | debug: 4.1.1
693 | engine.io-parser: 2.2.0
694 | has-cors: 1.1.0
695 | indexof: 0.0.1
696 | parseqs: 0.0.5
697 | parseuri: 0.0.5
698 | ws: 6.1.4
699 | xmlhttprequest-ssl: 1.5.5
700 | yeast: 0.1.2
701 | dev: false
702 | resolution:
703 | integrity: sha512-a4J5QO2k99CM2a0b12IznnyQndoEvtA4UAldhGzKqnHf42I3Qs2W5SPnDvatZRcMaNZs4IevVicBPayxYt6FwA==
704 | /engine.io-parser/2.2.0:
705 | dependencies:
706 | after: 0.8.2
707 | arraybuffer.slice: 0.0.7
708 | base64-arraybuffer: 0.1.5
709 | blob: 0.0.5
710 | has-binary2: 1.0.3
711 | dev: false
712 | resolution:
713 | integrity: sha512-6I3qD9iUxotsC5HEMuuGsKA0cXerGz+4uGcXQEkfBidgKf0amsjrrtwcbwK/nzpZBxclXlV7gGl9dgWvu4LF6w==
714 | /engine.io/3.4.0:
715 | dependencies:
716 | accepts: 1.3.7
717 | base64id: 2.0.0
718 | cookie: 0.3.1
719 | debug: 4.1.1
720 | engine.io-parser: 2.2.0
721 | ws: 7.1.2
722 | dev: false
723 | resolution:
724 | integrity: sha512-XCyYVWzcHnK5cMz7G4VTu2W7zJS7SM1QkcelghyIk/FmobWBtXE7fwhBusEKvCSqc3bMh8fNFMlUkCKTFRxH2w==
725 | /error-ex/1.3.2:
726 | dependencies:
727 | is-arrayish: 0.2.1
728 | dev: true
729 | resolution:
730 | integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
731 | /es-abstract/1.14.2:
732 | dependencies:
733 | es-to-primitive: 1.2.0
734 | function-bind: 1.1.1
735 | has: 1.0.3
736 | has-symbols: 1.0.0
737 | is-callable: 1.1.4
738 | is-regex: 1.0.4
739 | object-inspect: 1.6.0
740 | object-keys: 1.1.1
741 | string.prototype.trimleft: 2.1.0
742 | string.prototype.trimright: 2.1.0
743 | dev: true
744 | engines:
745 | node: '>= 0.4'
746 | resolution:
747 | integrity: sha512-DgoQmbpFNOofkjJtKwr87Ma5EW4Dc8fWhD0R+ndq7Oc456ivUfGOOP6oAZTTKl5/CcNMP+EN+e3/iUzgE0veZg==
748 | /es-to-primitive/1.2.0:
749 | dependencies:
750 | is-callable: 1.1.4
751 | is-date-object: 1.0.1
752 | is-symbol: 1.0.2
753 | dev: true
754 | engines:
755 | node: '>= 0.4'
756 | resolution:
757 | integrity: sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==
758 | /escape-html/1.0.3:
759 | dev: false
760 | resolution:
761 | integrity: sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=
762 | /escape-string-regexp/1.0.5:
763 | dev: true
764 | engines:
765 | node: '>=0.8.0'
766 | resolution:
767 | integrity: sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
768 | /eslint-config-airbnb-base/14.0.0_a5075551116d142daa65813c845087dd:
769 | dependencies:
770 | confusing-browser-globals: 1.0.9
771 | eslint: 6.4.0
772 | eslint-plugin-import: 2.18.2_eslint@6.4.0
773 | object.assign: 4.1.0
774 | object.entries: 1.1.0
775 | dev: true
776 | engines:
777 | node: '>= 6'
778 | peerDependencies:
779 | eslint: ^5.16.0 || ^6.1.0
780 | eslint-plugin-import: ^2.18.2
781 | resolution:
782 | integrity: sha512-2IDHobw97upExLmsebhtfoD3NAKhV4H0CJWP3Uprd/uk+cHuWYOczPVxQ8PxLFUAw7o3Th1RAU8u1DoUpr+cMA==
783 | /eslint-import-resolver-node/0.3.2:
784 | dependencies:
785 | debug: 2.6.9
786 | resolve: 1.12.0
787 | dev: true
788 | resolution:
789 | integrity: sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==
790 | /eslint-module-utils/2.4.1:
791 | dependencies:
792 | debug: 2.6.9
793 | pkg-dir: 2.0.0
794 | dev: true
795 | engines:
796 | node: '>=4'
797 | resolution:
798 | integrity: sha512-H6DOj+ejw7Tesdgbfs4jeS4YMFrT8uI8xwd1gtQqXssaR0EQ26L+2O/w6wkYFy2MymON0fTwHmXBvvfLNZVZEw==
799 | /eslint-plugin-import/2.18.2_eslint@6.4.0:
800 | dependencies:
801 | array-includes: 3.0.3
802 | contains-path: 0.1.0
803 | debug: 2.6.9
804 | doctrine: 1.5.0
805 | eslint: 6.4.0
806 | eslint-import-resolver-node: 0.3.2
807 | eslint-module-utils: 2.4.1
808 | has: 1.0.3
809 | minimatch: 3.0.4
810 | object.values: 1.1.0
811 | read-pkg-up: 2.0.0
812 | resolve: 1.12.0
813 | dev: true
814 | engines:
815 | node: '>=4'
816 | peerDependencies:
817 | eslint: 2.x - 6.x
818 | resolution:
819 | integrity: sha512-5ohpsHAiUBRNaBWAF08izwUGlbrJoJJ+W9/TBwsGoR1MnlgfwMIKrFeSjWbt6moabiXW9xNvtFz+97KHRfI4HQ==
820 | /eslint-scope/5.0.0:
821 | dependencies:
822 | esrecurse: 4.2.1
823 | estraverse: 4.3.0
824 | dev: true
825 | engines:
826 | node: '>=8.0.0'
827 | resolution:
828 | integrity: sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==
829 | /eslint-utils/1.4.2:
830 | dependencies:
831 | eslint-visitor-keys: 1.1.0
832 | dev: true
833 | engines:
834 | node: '>=6'
835 | resolution:
836 | integrity: sha512-eAZS2sEUMlIeCjBeubdj45dmBHQwPHWyBcT1VSYB7o9x9WRRqKxyUoiXlRjyAwzN7YEzHJlYg0NmzDRWx6GP4Q==
837 | /eslint-visitor-keys/1.1.0:
838 | dev: true
839 | engines:
840 | node: '>=4'
841 | resolution:
842 | integrity: sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==
843 | /eslint/6.4.0:
844 | dependencies:
845 | '@babel/code-frame': 7.5.5
846 | ajv: 6.10.2
847 | chalk: 2.4.2
848 | cross-spawn: 6.0.5
849 | debug: 4.1.1
850 | doctrine: 3.0.0
851 | eslint-scope: 5.0.0
852 | eslint-utils: 1.4.2
853 | eslint-visitor-keys: 1.1.0
854 | espree: 6.1.1
855 | esquery: 1.0.1
856 | esutils: 2.0.3
857 | file-entry-cache: 5.0.1
858 | functional-red-black-tree: 1.0.1
859 | glob-parent: 5.1.0
860 | globals: 11.12.0
861 | ignore: 4.0.6
862 | import-fresh: 3.1.0
863 | imurmurhash: 0.1.4
864 | inquirer: 6.5.2
865 | is-glob: 4.0.1
866 | js-yaml: 3.13.1
867 | json-stable-stringify-without-jsonify: 1.0.1
868 | levn: 0.3.0
869 | lodash: 4.17.15
870 | minimatch: 3.0.4
871 | mkdirp: 0.5.1
872 | natural-compare: 1.4.0
873 | optionator: 0.8.2
874 | progress: 2.0.3
875 | regexpp: 2.0.1
876 | semver: 6.3.0
877 | strip-ansi: 5.2.0
878 | strip-json-comments: 3.0.1
879 | table: 5.4.6
880 | text-table: 0.2.0
881 | v8-compile-cache: 2.1.0
882 | dev: true
883 | engines:
884 | node: ^8.10.0 || ^10.13.0 || >=11.10.1
885 | hasBin: true
886 | resolution:
887 | integrity: sha512-WTVEzK3lSFoXUovDHEbkJqCVPEPwbhCq4trDktNI6ygs7aO41d4cDT0JFAT5MivzZeVLWlg7vHL+bgrQv/t3vA==
888 | /espree/6.1.1:
889 | dependencies:
890 | acorn: 7.1.0
891 | acorn-jsx: 5.0.2_acorn@7.1.0
892 | eslint-visitor-keys: 1.1.0
893 | dev: true
894 | engines:
895 | node: '>=6.0.0'
896 | resolution:
897 | integrity: sha512-EYbr8XZUhWbYCqQRW0duU5LxzL5bETN6AjKBGy1302qqzPaCH10QbRg3Wvco79Z8x9WbiE8HYB4e75xl6qUYvQ==
898 | /esprima/4.0.1:
899 | dev: true
900 | engines:
901 | node: '>=4'
902 | hasBin: true
903 | resolution:
904 | integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
905 | /esquery/1.0.1:
906 | dependencies:
907 | estraverse: 4.3.0
908 | dev: true
909 | engines:
910 | node: '>=0.6'
911 | resolution:
912 | integrity: sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==
913 | /esrecurse/4.2.1:
914 | dependencies:
915 | estraverse: 4.3.0
916 | dev: true
917 | engines:
918 | node: '>=4.0'
919 | resolution:
920 | integrity: sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==
921 | /estraverse/4.3.0:
922 | dev: true
923 | engines:
924 | node: '>=4.0'
925 | resolution:
926 | integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==
927 | /esutils/2.0.3:
928 | dev: true
929 | engines:
930 | node: '>=0.10.0'
931 | resolution:
932 | integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
933 | /etag/1.8.1:
934 | dev: false
935 | engines:
936 | node: '>= 0.6'
937 | resolution:
938 | integrity: sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=
939 | /execa/0.7.0:
940 | dependencies:
941 | cross-spawn: 5.1.0
942 | get-stream: 3.0.0
943 | is-stream: 1.1.0
944 | npm-run-path: 2.0.2
945 | p-finally: 1.0.0
946 | signal-exit: 3.0.2
947 | strip-eof: 1.0.0
948 | dev: true
949 | engines:
950 | node: '>=4'
951 | resolution:
952 | integrity: sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=
953 | /expand-brackets/2.1.4:
954 | dependencies:
955 | debug: 2.6.9
956 | define-property: 0.2.5
957 | extend-shallow: 2.0.1
958 | posix-character-classes: 0.1.1
959 | regex-not: 1.0.2
960 | snapdragon: 0.8.2
961 | to-regex: 3.0.2
962 | dev: true
963 | engines:
964 | node: '>=0.10.0'
965 | resolution:
966 | integrity: sha1-t3c14xXOMPa27/D4OwQVGiJEliI=
967 | /express/4.17.1:
968 | dependencies:
969 | accepts: 1.3.7
970 | array-flatten: 1.1.1
971 | body-parser: 1.19.0
972 | content-disposition: 0.5.3
973 | content-type: 1.0.4
974 | cookie: 0.4.0
975 | cookie-signature: 1.0.6
976 | debug: 2.6.9
977 | depd: 1.1.2
978 | encodeurl: 1.0.2
979 | escape-html: 1.0.3
980 | etag: 1.8.1
981 | finalhandler: 1.1.2
982 | fresh: 0.5.2
983 | merge-descriptors: 1.0.1
984 | methods: 1.1.2
985 | on-finished: 2.3.0
986 | parseurl: 1.3.3
987 | path-to-regexp: 0.1.7
988 | proxy-addr: 2.0.5
989 | qs: 6.7.0
990 | range-parser: 1.2.1
991 | safe-buffer: 5.1.2
992 | send: 0.17.1
993 | serve-static: 1.14.1
994 | setprototypeof: 1.1.1
995 | statuses: 1.5.0
996 | type-is: 1.6.18
997 | utils-merge: 1.0.1
998 | vary: 1.1.2
999 | dev: false
1000 | engines:
1001 | node: '>= 0.10.0'
1002 | resolution:
1003 | integrity: sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==
1004 | /extend-shallow/2.0.1:
1005 | dependencies:
1006 | is-extendable: 0.1.1
1007 | dev: true
1008 | engines:
1009 | node: '>=0.10.0'
1010 | resolution:
1011 | integrity: sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=
1012 | /extend-shallow/3.0.2:
1013 | dependencies:
1014 | assign-symbols: 1.0.0
1015 | is-extendable: 1.0.1
1016 | dev: true
1017 | engines:
1018 | node: '>=0.10.0'
1019 | resolution:
1020 | integrity: sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=
1021 | /external-editor/3.1.0:
1022 | dependencies:
1023 | chardet: 0.7.0
1024 | iconv-lite: 0.4.24
1025 | tmp: 0.0.33
1026 | dev: true
1027 | engines:
1028 | node: '>=4'
1029 | resolution:
1030 | integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==
1031 | /extglob/2.0.4:
1032 | dependencies:
1033 | array-unique: 0.3.2
1034 | define-property: 1.0.0
1035 | expand-brackets: 2.1.4
1036 | extend-shallow: 2.0.1
1037 | fragment-cache: 0.2.1
1038 | regex-not: 1.0.2
1039 | snapdragon: 0.8.2
1040 | to-regex: 3.0.2
1041 | dev: true
1042 | engines:
1043 | node: '>=0.10.0'
1044 | resolution:
1045 | integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==
1046 | /fast-deep-equal/2.0.1:
1047 | dev: true
1048 | resolution:
1049 | integrity: sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=
1050 | /fast-json-stable-stringify/2.0.0:
1051 | dev: true
1052 | resolution:
1053 | integrity: sha1-1RQsDK7msRifh9OnYREGT4bIu/I=
1054 | /fast-levenshtein/2.0.6:
1055 | dev: true
1056 | resolution:
1057 | integrity: sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=
1058 | /figures/2.0.0:
1059 | dependencies:
1060 | escape-string-regexp: 1.0.5
1061 | dev: true
1062 | engines:
1063 | node: '>=4'
1064 | resolution:
1065 | integrity: sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=
1066 | /file-entry-cache/5.0.1:
1067 | dependencies:
1068 | flat-cache: 2.0.1
1069 | dev: true
1070 | engines:
1071 | node: '>=4'
1072 | resolution:
1073 | integrity: sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==
1074 | /fill-range/4.0.0:
1075 | dependencies:
1076 | extend-shallow: 2.0.1
1077 | is-number: 3.0.0
1078 | repeat-string: 1.6.1
1079 | to-regex-range: 2.1.1
1080 | dev: true
1081 | engines:
1082 | node: '>=0.10.0'
1083 | resolution:
1084 | integrity: sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=
1085 | /finalhandler/1.1.2:
1086 | dependencies:
1087 | debug: 2.6.9
1088 | encodeurl: 1.0.2
1089 | escape-html: 1.0.3
1090 | on-finished: 2.3.0
1091 | parseurl: 1.3.3
1092 | statuses: 1.5.0
1093 | unpipe: 1.0.0
1094 | dev: false
1095 | engines:
1096 | node: '>= 0.8'
1097 | resolution:
1098 | integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==
1099 | /find-up/2.1.0:
1100 | dependencies:
1101 | locate-path: 2.0.0
1102 | dev: true
1103 | engines:
1104 | node: '>=4'
1105 | resolution:
1106 | integrity: sha1-RdG35QbHF93UgndaK3eSCjwMV6c=
1107 | /flat-cache/2.0.1:
1108 | dependencies:
1109 | flatted: 2.0.1
1110 | rimraf: 2.6.3
1111 | write: 1.0.3
1112 | dev: true
1113 | engines:
1114 | node: '>=4'
1115 | resolution:
1116 | integrity: sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==
1117 | /flatted/2.0.1:
1118 | dev: true
1119 | resolution:
1120 | integrity: sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==
1121 | /for-in/1.0.2:
1122 | dev: true
1123 | engines:
1124 | node: '>=0.10.0'
1125 | resolution:
1126 | integrity: sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=
1127 | /forwarded/0.1.2:
1128 | dev: false
1129 | engines:
1130 | node: '>= 0.6'
1131 | resolution:
1132 | integrity: sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=
1133 | /fragment-cache/0.2.1:
1134 | dependencies:
1135 | map-cache: 0.2.2
1136 | dev: true
1137 | engines:
1138 | node: '>=0.10.0'
1139 | resolution:
1140 | integrity: sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=
1141 | /fresh/0.5.2:
1142 | dev: false
1143 | engines:
1144 | node: '>= 0.6'
1145 | resolution:
1146 | integrity: sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=
1147 | /fs.realpath/1.0.0:
1148 | dev: true
1149 | resolution:
1150 | integrity: sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
1151 | /fsevents/1.2.9:
1152 | bundledDependencies:
1153 | - node-pre-gyp
1154 | dependencies:
1155 | nan: 2.14.0
1156 | dev: true
1157 | engines:
1158 | node: '>=4.0'
1159 | optional: true
1160 | requiresBuild: true
1161 | resolution:
1162 | integrity: sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==
1163 | /function-bind/1.1.1:
1164 | dev: true
1165 | resolution:
1166 | integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
1167 | /functional-red-black-tree/1.0.1:
1168 | dev: true
1169 | resolution:
1170 | integrity: sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=
1171 | /get-stream/3.0.0:
1172 | dev: true
1173 | engines:
1174 | node: '>=4'
1175 | resolution:
1176 | integrity: sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=
1177 | /get-value/2.0.6:
1178 | dev: true
1179 | engines:
1180 | node: '>=0.10.0'
1181 | resolution:
1182 | integrity: sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=
1183 | /glob-parent/3.1.0:
1184 | dependencies:
1185 | is-glob: 3.1.0
1186 | path-dirname: 1.0.2
1187 | dev: true
1188 | resolution:
1189 | integrity: sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=
1190 | /glob-parent/5.1.0:
1191 | dependencies:
1192 | is-glob: 4.0.1
1193 | dev: true
1194 | engines:
1195 | node: '>= 6'
1196 | resolution:
1197 | integrity: sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==
1198 | /glob/7.1.4:
1199 | dependencies:
1200 | fs.realpath: 1.0.0
1201 | inflight: 1.0.6
1202 | inherits: 2.0.4
1203 | minimatch: 3.0.4
1204 | once: 1.4.0
1205 | path-is-absolute: 1.0.1
1206 | dev: true
1207 | resolution:
1208 | integrity: sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==
1209 | /global-dirs/0.1.1:
1210 | dependencies:
1211 | ini: 1.3.5
1212 | dev: true
1213 | engines:
1214 | node: '>=4'
1215 | resolution:
1216 | integrity: sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=
1217 | /globals/11.12.0:
1218 | dev: true
1219 | engines:
1220 | node: '>=4'
1221 | resolution:
1222 | integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
1223 | /got/6.7.1:
1224 | dependencies:
1225 | create-error-class: 3.0.2
1226 | duplexer3: 0.1.4
1227 | get-stream: 3.0.0
1228 | is-redirect: 1.0.0
1229 | is-retry-allowed: 1.2.0
1230 | is-stream: 1.1.0
1231 | lowercase-keys: 1.0.1
1232 | safe-buffer: 5.2.0
1233 | timed-out: 4.0.1
1234 | unzip-response: 2.0.1
1235 | url-parse-lax: 1.0.0
1236 | dev: true
1237 | engines:
1238 | node: '>=4'
1239 | resolution:
1240 | integrity: sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=
1241 | /graceful-fs/4.2.2:
1242 | dev: true
1243 | resolution:
1244 | integrity: sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==
1245 | /has-binary2/1.0.3:
1246 | dependencies:
1247 | isarray: 2.0.1
1248 | dev: false
1249 | resolution:
1250 | integrity: sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==
1251 | /has-cors/1.1.0:
1252 | dev: false
1253 | resolution:
1254 | integrity: sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=
1255 | /has-flag/3.0.0:
1256 | dev: true
1257 | engines:
1258 | node: '>=4'
1259 | resolution:
1260 | integrity: sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
1261 | /has-symbols/1.0.0:
1262 | dev: true
1263 | engines:
1264 | node: '>= 0.4'
1265 | resolution:
1266 | integrity: sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=
1267 | /has-value/0.3.1:
1268 | dependencies:
1269 | get-value: 2.0.6
1270 | has-values: 0.1.4
1271 | isobject: 2.1.0
1272 | dev: true
1273 | engines:
1274 | node: '>=0.10.0'
1275 | resolution:
1276 | integrity: sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=
1277 | /has-value/1.0.0:
1278 | dependencies:
1279 | get-value: 2.0.6
1280 | has-values: 1.0.0
1281 | isobject: 3.0.1
1282 | dev: true
1283 | engines:
1284 | node: '>=0.10.0'
1285 | resolution:
1286 | integrity: sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=
1287 | /has-values/0.1.4:
1288 | dev: true
1289 | engines:
1290 | node: '>=0.10.0'
1291 | resolution:
1292 | integrity: sha1-bWHeldkd/Km5oCCJrThL/49it3E=
1293 | /has-values/1.0.0:
1294 | dependencies:
1295 | is-number: 3.0.0
1296 | kind-of: 4.0.0
1297 | dev: true
1298 | engines:
1299 | node: '>=0.10.0'
1300 | resolution:
1301 | integrity: sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=
1302 | /has/1.0.3:
1303 | dependencies:
1304 | function-bind: 1.1.1
1305 | dev: true
1306 | engines:
1307 | node: '>= 0.4.0'
1308 | resolution:
1309 | integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
1310 | /hosted-git-info/2.8.4:
1311 | dev: true
1312 | resolution:
1313 | integrity: sha512-pzXIvANXEFrc5oFFXRMkbLPQ2rXRoDERwDLyrcUxGhaZhgP54BBSl9Oheh7Vv0T090cszWBxPjkQQ5Sq1PbBRQ==
1314 | /http-errors/1.7.2:
1315 | dependencies:
1316 | depd: 1.1.2
1317 | inherits: 2.0.3
1318 | setprototypeof: 1.1.1
1319 | statuses: 1.5.0
1320 | toidentifier: 1.0.0
1321 | dev: false
1322 | engines:
1323 | node: '>= 0.6'
1324 | resolution:
1325 | integrity: sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==
1326 | /http-errors/1.7.3:
1327 | dependencies:
1328 | depd: 1.1.2
1329 | inherits: 2.0.4
1330 | setprototypeof: 1.1.1
1331 | statuses: 1.5.0
1332 | toidentifier: 1.0.0
1333 | dev: false
1334 | engines:
1335 | node: '>= 0.6'
1336 | resolution:
1337 | integrity: sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==
1338 | /iconv-lite/0.4.24:
1339 | dependencies:
1340 | safer-buffer: 2.1.2
1341 | engines:
1342 | node: '>=0.10.0'
1343 | resolution:
1344 | integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
1345 | /ignore-by-default/1.0.1:
1346 | dev: true
1347 | resolution:
1348 | integrity: sha1-SMptcvbGo68Aqa1K5odr44ieKwk=
1349 | /ignore/4.0.6:
1350 | dev: true
1351 | engines:
1352 | node: '>= 4'
1353 | resolution:
1354 | integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==
1355 | /import-fresh/3.1.0:
1356 | dependencies:
1357 | parent-module: 1.0.1
1358 | resolve-from: 4.0.0
1359 | dev: true
1360 | engines:
1361 | node: '>=6'
1362 | resolution:
1363 | integrity: sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ==
1364 | /import-lazy/2.1.0:
1365 | dev: true
1366 | engines:
1367 | node: '>=4'
1368 | resolution:
1369 | integrity: sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=
1370 | /imurmurhash/0.1.4:
1371 | dev: true
1372 | engines:
1373 | node: '>=0.8.19'
1374 | resolution:
1375 | integrity: sha1-khi5srkoojixPcT7a21XbyMUU+o=
1376 | /indexof/0.0.1:
1377 | dev: false
1378 | resolution:
1379 | integrity: sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=
1380 | /inflight/1.0.6:
1381 | dependencies:
1382 | once: 1.4.0
1383 | wrappy: 1.0.2
1384 | dev: true
1385 | resolution:
1386 | integrity: sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=
1387 | /inherits/2.0.3:
1388 | dev: false
1389 | resolution:
1390 | integrity: sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
1391 | /inherits/2.0.4:
1392 | resolution:
1393 | integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
1394 | /ini/1.3.5:
1395 | dev: true
1396 | resolution:
1397 | integrity: sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==
1398 | /inquirer/6.5.2:
1399 | dependencies:
1400 | ansi-escapes: 3.2.0
1401 | chalk: 2.4.2
1402 | cli-cursor: 2.1.0
1403 | cli-width: 2.2.0
1404 | external-editor: 3.1.0
1405 | figures: 2.0.0
1406 | lodash: 4.17.15
1407 | mute-stream: 0.0.7
1408 | run-async: 2.3.0
1409 | rxjs: 6.5.3
1410 | string-width: 2.1.1
1411 | strip-ansi: 5.2.0
1412 | through: 2.3.8
1413 | dev: true
1414 | engines:
1415 | node: '>=6.0.0'
1416 | resolution:
1417 | integrity: sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==
1418 | /ipaddr.js/1.9.0:
1419 | dev: false
1420 | engines:
1421 | node: '>= 0.10'
1422 | resolution:
1423 | integrity: sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==
1424 | /is-accessor-descriptor/0.1.6:
1425 | dependencies:
1426 | kind-of: 3.2.2
1427 | dev: true
1428 | engines:
1429 | node: '>=0.10.0'
1430 | resolution:
1431 | integrity: sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=
1432 | /is-accessor-descriptor/1.0.0:
1433 | dependencies:
1434 | kind-of: 6.0.2
1435 | dev: true
1436 | engines:
1437 | node: '>=0.10.0'
1438 | resolution:
1439 | integrity: sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==
1440 | /is-arrayish/0.2.1:
1441 | dev: true
1442 | resolution:
1443 | integrity: sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=
1444 | /is-binary-path/1.0.1:
1445 | dependencies:
1446 | binary-extensions: 1.13.1
1447 | dev: true
1448 | engines:
1449 | node: '>=0.10.0'
1450 | resolution:
1451 | integrity: sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=
1452 | /is-buffer/1.1.6:
1453 | dev: true
1454 | resolution:
1455 | integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
1456 | /is-callable/1.1.4:
1457 | dev: true
1458 | engines:
1459 | node: '>= 0.4'
1460 | resolution:
1461 | integrity: sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==
1462 | /is-ci/1.2.1:
1463 | dependencies:
1464 | ci-info: 1.6.0
1465 | dev: true
1466 | hasBin: true
1467 | resolution:
1468 | integrity: sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==
1469 | /is-data-descriptor/0.1.4:
1470 | dependencies:
1471 | kind-of: 3.2.2
1472 | dev: true
1473 | engines:
1474 | node: '>=0.10.0'
1475 | resolution:
1476 | integrity: sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=
1477 | /is-data-descriptor/1.0.0:
1478 | dependencies:
1479 | kind-of: 6.0.2
1480 | dev: true
1481 | engines:
1482 | node: '>=0.10.0'
1483 | resolution:
1484 | integrity: sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==
1485 | /is-date-object/1.0.1:
1486 | dev: true
1487 | engines:
1488 | node: '>= 0.4'
1489 | resolution:
1490 | integrity: sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=
1491 | /is-descriptor/0.1.6:
1492 | dependencies:
1493 | is-accessor-descriptor: 0.1.6
1494 | is-data-descriptor: 0.1.4
1495 | kind-of: 5.1.0
1496 | dev: true
1497 | engines:
1498 | node: '>=0.10.0'
1499 | resolution:
1500 | integrity: sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==
1501 | /is-descriptor/1.0.2:
1502 | dependencies:
1503 | is-accessor-descriptor: 1.0.0
1504 | is-data-descriptor: 1.0.0
1505 | kind-of: 6.0.2
1506 | dev: true
1507 | engines:
1508 | node: '>=0.10.0'
1509 | resolution:
1510 | integrity: sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==
1511 | /is-extendable/0.1.1:
1512 | dev: true
1513 | engines:
1514 | node: '>=0.10.0'
1515 | resolution:
1516 | integrity: sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=
1517 | /is-extendable/1.0.1:
1518 | dependencies:
1519 | is-plain-object: 2.0.4
1520 | dev: true
1521 | engines:
1522 | node: '>=0.10.0'
1523 | resolution:
1524 | integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==
1525 | /is-extglob/2.1.1:
1526 | dev: true
1527 | engines:
1528 | node: '>=0.10.0'
1529 | resolution:
1530 | integrity: sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
1531 | /is-fullwidth-code-point/2.0.0:
1532 | dev: true
1533 | engines:
1534 | node: '>=4'
1535 | resolution:
1536 | integrity: sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=
1537 | /is-glob/3.1.0:
1538 | dependencies:
1539 | is-extglob: 2.1.1
1540 | dev: true
1541 | engines:
1542 | node: '>=0.10.0'
1543 | resolution:
1544 | integrity: sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=
1545 | /is-glob/4.0.1:
1546 | dependencies:
1547 | is-extglob: 2.1.1
1548 | dev: true
1549 | engines:
1550 | node: '>=0.10.0'
1551 | resolution:
1552 | integrity: sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==
1553 | /is-installed-globally/0.1.0:
1554 | dependencies:
1555 | global-dirs: 0.1.1
1556 | is-path-inside: 1.0.1
1557 | dev: true
1558 | engines:
1559 | node: '>=4'
1560 | resolution:
1561 | integrity: sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=
1562 | /is-npm/1.0.0:
1563 | dev: true
1564 | engines:
1565 | node: '>=0.10.0'
1566 | resolution:
1567 | integrity: sha1-8vtjpl5JBbQGyGBydloaTceTufQ=
1568 | /is-number/3.0.0:
1569 | dependencies:
1570 | kind-of: 3.2.2
1571 | dev: true
1572 | engines:
1573 | node: '>=0.10.0'
1574 | resolution:
1575 | integrity: sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=
1576 | /is-obj/1.0.1:
1577 | dev: true
1578 | engines:
1579 | node: '>=0.10.0'
1580 | resolution:
1581 | integrity: sha1-PkcprB9f3gJc19g6iW2rn09n2w8=
1582 | /is-path-inside/1.0.1:
1583 | dependencies:
1584 | path-is-inside: 1.0.2
1585 | dev: true
1586 | engines:
1587 | node: '>=0.10.0'
1588 | resolution:
1589 | integrity: sha1-jvW33lBDej/cprToZe96pVy0gDY=
1590 | /is-plain-object/2.0.4:
1591 | dependencies:
1592 | isobject: 3.0.1
1593 | dev: true
1594 | engines:
1595 | node: '>=0.10.0'
1596 | resolution:
1597 | integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==
1598 | /is-promise/2.1.0:
1599 | dev: true
1600 | resolution:
1601 | integrity: sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=
1602 | /is-redirect/1.0.0:
1603 | dev: true
1604 | engines:
1605 | node: '>=0.10.0'
1606 | resolution:
1607 | integrity: sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=
1608 | /is-regex/1.0.4:
1609 | dependencies:
1610 | has: 1.0.3
1611 | dev: true
1612 | engines:
1613 | node: '>= 0.4'
1614 | resolution:
1615 | integrity: sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=
1616 | /is-retry-allowed/1.2.0:
1617 | dev: true
1618 | engines:
1619 | node: '>=0.10.0'
1620 | resolution:
1621 | integrity: sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==
1622 | /is-stream/1.1.0:
1623 | dev: true
1624 | engines:
1625 | node: '>=0.10.0'
1626 | resolution:
1627 | integrity: sha1-EtSj3U5o4Lec6428hBc66A2RykQ=
1628 | /is-symbol/1.0.2:
1629 | dependencies:
1630 | has-symbols: 1.0.0
1631 | dev: true
1632 | engines:
1633 | node: '>= 0.4'
1634 | resolution:
1635 | integrity: sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==
1636 | /is-windows/1.0.2:
1637 | dev: true
1638 | engines:
1639 | node: '>=0.10.0'
1640 | resolution:
1641 | integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==
1642 | /isarray/1.0.0:
1643 | dev: true
1644 | resolution:
1645 | integrity: sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
1646 | /isarray/2.0.1:
1647 | dev: false
1648 | resolution:
1649 | integrity: sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=
1650 | /isexe/2.0.0:
1651 | dev: true
1652 | resolution:
1653 | integrity: sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
1654 | /isobject/2.1.0:
1655 | dependencies:
1656 | isarray: 1.0.0
1657 | dev: true
1658 | engines:
1659 | node: '>=0.10.0'
1660 | resolution:
1661 | integrity: sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=
1662 | /isobject/3.0.1:
1663 | dev: true
1664 | engines:
1665 | node: '>=0.10.0'
1666 | resolution:
1667 | integrity: sha1-TkMekrEalzFjaqH5yNHMvP2reN8=
1668 | /js-tokens/4.0.0:
1669 | dev: true
1670 | resolution:
1671 | integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
1672 | /js-yaml/3.13.1:
1673 | dependencies:
1674 | argparse: 1.0.10
1675 | esprima: 4.0.1
1676 | dev: true
1677 | hasBin: true
1678 | resolution:
1679 | integrity: sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==
1680 | /json-schema-traverse/0.4.1:
1681 | dev: true
1682 | resolution:
1683 | integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
1684 | /json-stable-stringify-without-jsonify/1.0.1:
1685 | dev: true
1686 | resolution:
1687 | integrity: sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=
1688 | /kind-of/3.2.2:
1689 | dependencies:
1690 | is-buffer: 1.1.6
1691 | dev: true
1692 | engines:
1693 | node: '>=0.10.0'
1694 | resolution:
1695 | integrity: sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=
1696 | /kind-of/4.0.0:
1697 | dependencies:
1698 | is-buffer: 1.1.6
1699 | dev: true
1700 | engines:
1701 | node: '>=0.10.0'
1702 | resolution:
1703 | integrity: sha1-IIE989cSkosgc3hpGkUGb65y3Vc=
1704 | /kind-of/5.1.0:
1705 | dev: true
1706 | engines:
1707 | node: '>=0.10.0'
1708 | resolution:
1709 | integrity: sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==
1710 | /kind-of/6.0.2:
1711 | dev: true
1712 | engines:
1713 | node: '>=0.10.0'
1714 | resolution:
1715 | integrity: sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==
1716 | /latest-version/3.1.0:
1717 | dependencies:
1718 | package-json: 4.0.1
1719 | dev: true
1720 | engines:
1721 | node: '>=4'
1722 | resolution:
1723 | integrity: sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=
1724 | /levn/0.3.0:
1725 | dependencies:
1726 | prelude-ls: 1.1.2
1727 | type-check: 0.3.2
1728 | dev: true
1729 | engines:
1730 | node: '>= 0.8.0'
1731 | resolution:
1732 | integrity: sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=
1733 | /load-json-file/2.0.0:
1734 | dependencies:
1735 | graceful-fs: 4.2.2
1736 | parse-json: 2.2.0
1737 | pify: 2.3.0
1738 | strip-bom: 3.0.0
1739 | dev: true
1740 | engines:
1741 | node: '>=4'
1742 | resolution:
1743 | integrity: sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=
1744 | /locate-path/2.0.0:
1745 | dependencies:
1746 | p-locate: 2.0.0
1747 | path-exists: 3.0.0
1748 | dev: true
1749 | engines:
1750 | node: '>=4'
1751 | resolution:
1752 | integrity: sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=
1753 | /lodash/4.17.15:
1754 | dev: true
1755 | resolution:
1756 | integrity: sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==
1757 | /lowercase-keys/1.0.1:
1758 | dev: true
1759 | engines:
1760 | node: '>=0.10.0'
1761 | resolution:
1762 | integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==
1763 | /lru-cache/4.1.5:
1764 | dependencies:
1765 | pseudomap: 1.0.2
1766 | yallist: 2.1.2
1767 | dev: true
1768 | resolution:
1769 | integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==
1770 | /make-dir/1.3.0:
1771 | dependencies:
1772 | pify: 3.0.0
1773 | dev: true
1774 | engines:
1775 | node: '>=4'
1776 | resolution:
1777 | integrity: sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==
1778 | /map-cache/0.2.2:
1779 | dev: true
1780 | engines:
1781 | node: '>=0.10.0'
1782 | resolution:
1783 | integrity: sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=
1784 | /map-visit/1.0.0:
1785 | dependencies:
1786 | object-visit: 1.0.1
1787 | dev: true
1788 | engines:
1789 | node: '>=0.10.0'
1790 | resolution:
1791 | integrity: sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=
1792 | /media-typer/0.3.0:
1793 | dev: false
1794 | engines:
1795 | node: '>= 0.6'
1796 | resolution:
1797 | integrity: sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=
1798 | /merge-descriptors/1.0.1:
1799 | dev: false
1800 | resolution:
1801 | integrity: sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=
1802 | /methods/1.1.2:
1803 | dev: false
1804 | engines:
1805 | node: '>= 0.6'
1806 | resolution:
1807 | integrity: sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=
1808 | /micromatch/3.1.10:
1809 | dependencies:
1810 | arr-diff: 4.0.0
1811 | array-unique: 0.3.2
1812 | braces: 2.3.2
1813 | define-property: 2.0.2
1814 | extend-shallow: 3.0.2
1815 | extglob: 2.0.4
1816 | fragment-cache: 0.2.1
1817 | kind-of: 6.0.2
1818 | nanomatch: 1.2.13
1819 | object.pick: 1.3.0
1820 | regex-not: 1.0.2
1821 | snapdragon: 0.8.2
1822 | to-regex: 3.0.2
1823 | dev: true
1824 | engines:
1825 | node: '>=0.10.0'
1826 | resolution:
1827 | integrity: sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==
1828 | /mime-db/1.40.0:
1829 | dev: false
1830 | engines:
1831 | node: '>= 0.6'
1832 | resolution:
1833 | integrity: sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==
1834 | /mime-types/2.1.24:
1835 | dependencies:
1836 | mime-db: 1.40.0
1837 | dev: false
1838 | engines:
1839 | node: '>= 0.6'
1840 | resolution:
1841 | integrity: sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==
1842 | /mime/1.6.0:
1843 | dev: false
1844 | engines:
1845 | node: '>=4'
1846 | hasBin: true
1847 | resolution:
1848 | integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
1849 | /mimic-fn/1.2.0:
1850 | dev: true
1851 | engines:
1852 | node: '>=4'
1853 | resolution:
1854 | integrity: sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==
1855 | /minimatch/3.0.4:
1856 | dependencies:
1857 | brace-expansion: 1.1.11
1858 | dev: true
1859 | resolution:
1860 | integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
1861 | /minimist/0.0.8:
1862 | dev: true
1863 | resolution:
1864 | integrity: sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=
1865 | /minimist/1.2.0:
1866 | dev: true
1867 | resolution:
1868 | integrity: sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=
1869 | /mixin-deep/1.3.2:
1870 | dependencies:
1871 | for-in: 1.0.2
1872 | is-extendable: 1.0.1
1873 | dev: true
1874 | engines:
1875 | node: '>=0.10.0'
1876 | resolution:
1877 | integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==
1878 | /mkdirp/0.5.1:
1879 | dependencies:
1880 | minimist: 0.0.8
1881 | dev: true
1882 | hasBin: true
1883 | resolution:
1884 | integrity: sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=
1885 | /morgan/1.9.1:
1886 | dependencies:
1887 | basic-auth: 2.0.1
1888 | debug: 2.6.9
1889 | depd: 1.1.2
1890 | on-finished: 2.3.0
1891 | on-headers: 1.0.2
1892 | dev: false
1893 | engines:
1894 | node: '>= 0.8.0'
1895 | resolution:
1896 | integrity: sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA==
1897 | /ms/2.0.0:
1898 | resolution:
1899 | integrity: sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
1900 | /ms/2.1.1:
1901 | dev: false
1902 | resolution:
1903 | integrity: sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==
1904 | /ms/2.1.2:
1905 | resolution:
1906 | integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
1907 | /mute-stream/0.0.7:
1908 | dev: true
1909 | resolution:
1910 | integrity: sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=
1911 | /nan/2.14.0:
1912 | dev: true
1913 | optional: true
1914 | resolution:
1915 | integrity: sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==
1916 | /nanomatch/1.2.13:
1917 | dependencies:
1918 | arr-diff: 4.0.0
1919 | array-unique: 0.3.2
1920 | define-property: 2.0.2
1921 | extend-shallow: 3.0.2
1922 | fragment-cache: 0.2.1
1923 | is-windows: 1.0.2
1924 | kind-of: 6.0.2
1925 | object.pick: 1.3.0
1926 | regex-not: 1.0.2
1927 | snapdragon: 0.8.2
1928 | to-regex: 3.0.2
1929 | dev: true
1930 | engines:
1931 | node: '>=0.10.0'
1932 | resolution:
1933 | integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==
1934 | /natural-compare/1.4.0:
1935 | dev: true
1936 | resolution:
1937 | integrity: sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
1938 | /negotiator/0.6.2:
1939 | dev: false
1940 | engines:
1941 | node: '>= 0.6'
1942 | resolution:
1943 | integrity: sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==
1944 | /nice-try/1.0.5:
1945 | dev: true
1946 | resolution:
1947 | integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==
1948 | /node-fetch/2.6.0:
1949 | dev: false
1950 | engines:
1951 | node: 4.x || >=6.0.0
1952 | resolution:
1953 | integrity: sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==
1954 | /nodemon/1.19.2:
1955 | dependencies:
1956 | chokidar: 2.1.8
1957 | debug: 3.2.6
1958 | ignore-by-default: 1.0.1
1959 | minimatch: 3.0.4
1960 | pstree.remy: 1.1.7
1961 | semver: 5.7.1
1962 | supports-color: 5.5.0
1963 | touch: 3.1.0
1964 | undefsafe: 2.0.2
1965 | update-notifier: 2.5.0
1966 | dev: true
1967 | engines:
1968 | node: '>=4'
1969 | hasBin: true
1970 | requiresBuild: true
1971 | resolution:
1972 | integrity: sha512-hRLYaw5Ihyw9zK7NF+9EUzVyS6Cvgc14yh8CAYr38tPxJa6UrOxwAQ351GwrgoanHCF0FalQFn6w5eoX/LGdJw==
1973 | /nopt/1.0.10:
1974 | dependencies:
1975 | abbrev: 1.1.1
1976 | dev: true
1977 | hasBin: true
1978 | resolution:
1979 | integrity: sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=
1980 | /normalize-package-data/2.5.0:
1981 | dependencies:
1982 | hosted-git-info: 2.8.4
1983 | resolve: 1.12.0
1984 | semver: 5.7.1
1985 | validate-npm-package-license: 3.0.4
1986 | dev: true
1987 | resolution:
1988 | integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==
1989 | /normalize-path/2.1.1:
1990 | dependencies:
1991 | remove-trailing-separator: 1.1.0
1992 | dev: true
1993 | engines:
1994 | node: '>=0.10.0'
1995 | resolution:
1996 | integrity: sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=
1997 | /normalize-path/3.0.0:
1998 | dev: true
1999 | engines:
2000 | node: '>=0.10.0'
2001 | resolution:
2002 | integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
2003 | /npm-run-path/2.0.2:
2004 | dependencies:
2005 | path-key: 2.0.1
2006 | dev: true
2007 | engines:
2008 | node: '>=4'
2009 | resolution:
2010 | integrity: sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=
2011 | /oauth/0.9.15:
2012 | dev: false
2013 | resolution:
2014 | integrity: sha1-vR/vr2hslrdUda7VGWQS/2DPucE=
2015 | /object-assign/4.1.1:
2016 | dev: false
2017 | engines:
2018 | node: '>=0.10.0'
2019 | resolution:
2020 | integrity: sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
2021 | /object-component/0.0.3:
2022 | dev: false
2023 | resolution:
2024 | integrity: sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=
2025 | /object-copy/0.1.0:
2026 | dependencies:
2027 | copy-descriptor: 0.1.1
2028 | define-property: 0.2.5
2029 | kind-of: 3.2.2
2030 | dev: true
2031 | engines:
2032 | node: '>=0.10.0'
2033 | resolution:
2034 | integrity: sha1-fn2Fi3gb18mRpBupde04EnVOmYw=
2035 | /object-inspect/1.6.0:
2036 | dev: true
2037 | resolution:
2038 | integrity: sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==
2039 | /object-keys/1.1.1:
2040 | dev: true
2041 | engines:
2042 | node: '>= 0.4'
2043 | resolution:
2044 | integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
2045 | /object-visit/1.0.1:
2046 | dependencies:
2047 | isobject: 3.0.1
2048 | dev: true
2049 | engines:
2050 | node: '>=0.10.0'
2051 | resolution:
2052 | integrity: sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=
2053 | /object.assign/4.1.0:
2054 | dependencies:
2055 | define-properties: 1.1.3
2056 | function-bind: 1.1.1
2057 | has-symbols: 1.0.0
2058 | object-keys: 1.1.1
2059 | dev: true
2060 | engines:
2061 | node: '>= 0.4'
2062 | resolution:
2063 | integrity: sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==
2064 | /object.entries/1.1.0:
2065 | dependencies:
2066 | define-properties: 1.1.3
2067 | es-abstract: 1.14.2
2068 | function-bind: 1.1.1
2069 | has: 1.0.3
2070 | dev: true
2071 | engines:
2072 | node: '>= 0.4'
2073 | resolution:
2074 | integrity: sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA==
2075 | /object.pick/1.3.0:
2076 | dependencies:
2077 | isobject: 3.0.1
2078 | dev: true
2079 | engines:
2080 | node: '>=0.10.0'
2081 | resolution:
2082 | integrity: sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=
2083 | /object.values/1.1.0:
2084 | dependencies:
2085 | define-properties: 1.1.3
2086 | es-abstract: 1.14.2
2087 | function-bind: 1.1.1
2088 | has: 1.0.3
2089 | dev: true
2090 | engines:
2091 | node: '>= 0.4'
2092 | resolution:
2093 | integrity: sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg==
2094 | /on-finished/2.3.0:
2095 | dependencies:
2096 | ee-first: 1.1.1
2097 | dev: false
2098 | engines:
2099 | node: '>= 0.8'
2100 | resolution:
2101 | integrity: sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=
2102 | /on-headers/1.0.2:
2103 | dev: false
2104 | engines:
2105 | node: '>= 0.8'
2106 | resolution:
2107 | integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==
2108 | /once/1.4.0:
2109 | dependencies:
2110 | wrappy: 1.0.2
2111 | dev: true
2112 | resolution:
2113 | integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
2114 | /onetime/2.0.1:
2115 | dependencies:
2116 | mimic-fn: 1.2.0
2117 | dev: true
2118 | engines:
2119 | node: '>=4'
2120 | resolution:
2121 | integrity: sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=
2122 | /optionator/0.8.2:
2123 | dependencies:
2124 | deep-is: 0.1.3
2125 | fast-levenshtein: 2.0.6
2126 | levn: 0.3.0
2127 | prelude-ls: 1.1.2
2128 | type-check: 0.3.2
2129 | wordwrap: 1.0.0
2130 | dev: true
2131 | engines:
2132 | node: '>= 0.8.0'
2133 | resolution:
2134 | integrity: sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=
2135 | /os-tmpdir/1.0.2:
2136 | dev: true
2137 | engines:
2138 | node: '>=0.10.0'
2139 | resolution:
2140 | integrity: sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=
2141 | /p-finally/1.0.0:
2142 | dev: true
2143 | engines:
2144 | node: '>=4'
2145 | resolution:
2146 | integrity: sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=
2147 | /p-limit/1.3.0:
2148 | dependencies:
2149 | p-try: 1.0.0
2150 | dev: true
2151 | engines:
2152 | node: '>=4'
2153 | resolution:
2154 | integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==
2155 | /p-locate/2.0.0:
2156 | dependencies:
2157 | p-limit: 1.3.0
2158 | dev: true
2159 | engines:
2160 | node: '>=4'
2161 | resolution:
2162 | integrity: sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=
2163 | /p-try/1.0.0:
2164 | dev: true
2165 | engines:
2166 | node: '>=4'
2167 | resolution:
2168 | integrity: sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=
2169 | /package-json/4.0.1:
2170 | dependencies:
2171 | got: 6.7.1
2172 | registry-auth-token: 3.4.0
2173 | registry-url: 3.1.0
2174 | semver: 5.7.1
2175 | dev: true
2176 | engines:
2177 | node: '>=4'
2178 | resolution:
2179 | integrity: sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=
2180 | /parent-module/1.0.1:
2181 | dependencies:
2182 | callsites: 3.1.0
2183 | dev: true
2184 | engines:
2185 | node: '>=6'
2186 | resolution:
2187 | integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==
2188 | /parse-json/2.2.0:
2189 | dependencies:
2190 | error-ex: 1.3.2
2191 | dev: true
2192 | engines:
2193 | node: '>=0.10.0'
2194 | resolution:
2195 | integrity: sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=
2196 | /parseqs/0.0.5:
2197 | dependencies:
2198 | better-assert: 1.0.2
2199 | dev: false
2200 | resolution:
2201 | integrity: sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=
2202 | /parseuri/0.0.5:
2203 | dependencies:
2204 | better-assert: 1.0.2
2205 | dev: false
2206 | resolution:
2207 | integrity: sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=
2208 | /parseurl/1.3.3:
2209 | dev: false
2210 | engines:
2211 | node: '>= 0.8'
2212 | resolution:
2213 | integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==
2214 | /pascalcase/0.1.1:
2215 | dev: true
2216 | engines:
2217 | node: '>=0.10.0'
2218 | resolution:
2219 | integrity: sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=
2220 | /passport-google-oauth20/2.0.0:
2221 | dependencies:
2222 | passport-oauth2: 1.5.0
2223 | dev: false
2224 | engines:
2225 | node: '>= 0.4.0'
2226 | resolution:
2227 | integrity: sha512-KSk6IJ15RoxuGq7D1UKK/8qKhNfzbLeLrG3gkLZ7p4A6DBCcv7xpyQwuXtWdpyR0+E0mwkpjY1VfPOhxQrKzdQ==
2228 | /passport-oauth2/1.5.0:
2229 | dependencies:
2230 | base64url: 3.0.1
2231 | oauth: 0.9.15
2232 | passport-strategy: 1.0.0
2233 | uid2: 0.0.3
2234 | utils-merge: 1.0.1
2235 | dev: false
2236 | engines:
2237 | node: '>= 0.4.0'
2238 | resolution:
2239 | integrity: sha512-kqBt6vR/5VlCK8iCx1/KpY42kQ+NEHZwsSyt4Y6STiNjU+wWICG1i8ucc1FapXDGO15C5O5VZz7+7vRzrDPXXQ==
2240 | /passport-strategy/1.0.0:
2241 | dev: false
2242 | engines:
2243 | node: '>= 0.4.0'
2244 | resolution:
2245 | integrity: sha1-tVOaqPwiWj0a0XlHbd8ja0QPUuQ=
2246 | /passport/0.4.0:
2247 | dependencies:
2248 | passport-strategy: 1.0.0
2249 | pause: 0.0.1
2250 | dev: false
2251 | engines:
2252 | node: '>= 0.4.0'
2253 | resolution:
2254 | integrity: sha1-xQlWkTR71a07XhgCOMORTRbwWBE=
2255 | /path-dirname/1.0.2:
2256 | dev: true
2257 | resolution:
2258 | integrity: sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=
2259 | /path-exists/3.0.0:
2260 | dev: true
2261 | engines:
2262 | node: '>=4'
2263 | resolution:
2264 | integrity: sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=
2265 | /path-is-absolute/1.0.1:
2266 | dev: true
2267 | engines:
2268 | node: '>=0.10.0'
2269 | resolution:
2270 | integrity: sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
2271 | /path-is-inside/1.0.2:
2272 | dev: true
2273 | resolution:
2274 | integrity: sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=
2275 | /path-key/2.0.1:
2276 | dev: true
2277 | engines:
2278 | node: '>=4'
2279 | resolution:
2280 | integrity: sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=
2281 | /path-parse/1.0.6:
2282 | dev: true
2283 | resolution:
2284 | integrity: sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==
2285 | /path-to-regexp/0.1.7:
2286 | dev: false
2287 | resolution:
2288 | integrity: sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=
2289 | /path-type/2.0.0:
2290 | dependencies:
2291 | pify: 2.3.0
2292 | dev: true
2293 | engines:
2294 | node: '>=4'
2295 | resolution:
2296 | integrity: sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=
2297 | /pause/0.0.1:
2298 | dev: false
2299 | resolution:
2300 | integrity: sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10=
2301 | /pify/2.3.0:
2302 | dev: true
2303 | engines:
2304 | node: '>=0.10.0'
2305 | resolution:
2306 | integrity: sha1-7RQaasBDqEnqWISY59yosVMw6Qw=
2307 | /pify/3.0.0:
2308 | dev: true
2309 | engines:
2310 | node: '>=4'
2311 | resolution:
2312 | integrity: sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=
2313 | /pkg-dir/2.0.0:
2314 | dependencies:
2315 | find-up: 2.1.0
2316 | dev: true
2317 | engines:
2318 | node: '>=4'
2319 | resolution:
2320 | integrity: sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=
2321 | /posix-character-classes/0.1.1:
2322 | dev: true
2323 | engines:
2324 | node: '>=0.10.0'
2325 | resolution:
2326 | integrity: sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=
2327 | /prelude-ls/1.1.2:
2328 | dev: true
2329 | engines:
2330 | node: '>= 0.8.0'
2331 | resolution:
2332 | integrity: sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=
2333 | /prepend-http/1.0.4:
2334 | dev: true
2335 | engines:
2336 | node: '>=0.10.0'
2337 | resolution:
2338 | integrity: sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=
2339 | /process-nextick-args/2.0.1:
2340 | dev: true
2341 | resolution:
2342 | integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
2343 | /progress/2.0.3:
2344 | dev: true
2345 | engines:
2346 | node: '>=0.4.0'
2347 | resolution:
2348 | integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
2349 | /proxy-addr/2.0.5:
2350 | dependencies:
2351 | forwarded: 0.1.2
2352 | ipaddr.js: 1.9.0
2353 | dev: false
2354 | engines:
2355 | node: '>= 0.10'
2356 | resolution:
2357 | integrity: sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==
2358 | /pseudomap/1.0.2:
2359 | dev: true
2360 | resolution:
2361 | integrity: sha1-8FKijacOYYkX7wqKw0wa5aaChrM=
2362 | /pstree.remy/1.1.7:
2363 | dev: true
2364 | resolution:
2365 | integrity: sha512-xsMgrUwRpuGskEzBFkH8NmTimbZ5PcPup0LA8JJkHIm2IMUbQcpo3yeLNWVrufEYjh8YwtSVh0xz6UeWc5Oh5A==
2366 | /punycode/2.1.1:
2367 | dev: true
2368 | engines:
2369 | node: '>=6'
2370 | resolution:
2371 | integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
2372 | /qs/6.7.0:
2373 | dev: false
2374 | engines:
2375 | node: '>=0.6'
2376 | resolution:
2377 | integrity: sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==
2378 | /range-parser/1.2.1:
2379 | dev: false
2380 | engines:
2381 | node: '>= 0.6'
2382 | resolution:
2383 | integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==
2384 | /raw-body/2.4.0:
2385 | dependencies:
2386 | bytes: 3.1.0
2387 | http-errors: 1.7.2
2388 | iconv-lite: 0.4.24
2389 | unpipe: 1.0.0
2390 | dev: false
2391 | engines:
2392 | node: '>= 0.8'
2393 | resolution:
2394 | integrity: sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==
2395 | /rc/1.2.8:
2396 | dependencies:
2397 | deep-extend: 0.6.0
2398 | ini: 1.3.5
2399 | minimist: 1.2.0
2400 | strip-json-comments: 2.0.1
2401 | dev: true
2402 | hasBin: true
2403 | resolution:
2404 | integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==
2405 | /read-pkg-up/2.0.0:
2406 | dependencies:
2407 | find-up: 2.1.0
2408 | read-pkg: 2.0.0
2409 | dev: true
2410 | engines:
2411 | node: '>=4'
2412 | resolution:
2413 | integrity: sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=
2414 | /read-pkg/2.0.0:
2415 | dependencies:
2416 | load-json-file: 2.0.0
2417 | normalize-package-data: 2.5.0
2418 | path-type: 2.0.0
2419 | dev: true
2420 | engines:
2421 | node: '>=4'
2422 | resolution:
2423 | integrity: sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=
2424 | /readable-stream/2.3.6:
2425 | dependencies:
2426 | core-util-is: 1.0.2
2427 | inherits: 2.0.4
2428 | isarray: 1.0.0
2429 | process-nextick-args: 2.0.1
2430 | safe-buffer: 5.1.2
2431 | string_decoder: 1.1.1
2432 | util-deprecate: 1.0.2
2433 | dev: true
2434 | resolution:
2435 | integrity: sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==
2436 | /readdirp/2.2.1:
2437 | dependencies:
2438 | graceful-fs: 4.2.2
2439 | micromatch: 3.1.10
2440 | readable-stream: 2.3.6
2441 | dev: true
2442 | engines:
2443 | node: '>=0.10'
2444 | resolution:
2445 | integrity: sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==
2446 | /regex-not/1.0.2:
2447 | dependencies:
2448 | extend-shallow: 3.0.2
2449 | safe-regex: 1.1.0
2450 | dev: true
2451 | engines:
2452 | node: '>=0.10.0'
2453 | resolution:
2454 | integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==
2455 | /regexpp/2.0.1:
2456 | dev: true
2457 | engines:
2458 | node: '>=6.5.0'
2459 | resolution:
2460 | integrity: sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==
2461 | /registry-auth-token/3.4.0:
2462 | dependencies:
2463 | rc: 1.2.8
2464 | safe-buffer: 5.2.0
2465 | dev: true
2466 | resolution:
2467 | integrity: sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==
2468 | /registry-url/3.1.0:
2469 | dependencies:
2470 | rc: 1.2.8
2471 | dev: true
2472 | engines:
2473 | node: '>=0.10.0'
2474 | resolution:
2475 | integrity: sha1-PU74cPc93h138M+aOBQyRE4XSUI=
2476 | /remove-trailing-separator/1.1.0:
2477 | dev: true
2478 | resolution:
2479 | integrity: sha1-wkvOKig62tW8P1jg1IJJuSN52O8=
2480 | /repeat-element/1.1.3:
2481 | dev: true
2482 | engines:
2483 | node: '>=0.10.0'
2484 | resolution:
2485 | integrity: sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==
2486 | /repeat-string/1.6.1:
2487 | dev: true
2488 | engines:
2489 | node: '>=0.10'
2490 | resolution:
2491 | integrity: sha1-jcrkcOHIirwtYA//Sndihtp15jc=
2492 | /resolve-from/4.0.0:
2493 | dev: true
2494 | engines:
2495 | node: '>=4'
2496 | resolution:
2497 | integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
2498 | /resolve-url/0.2.1:
2499 | dev: true
2500 | resolution:
2501 | integrity: sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=
2502 | /resolve/1.12.0:
2503 | dependencies:
2504 | path-parse: 1.0.6
2505 | dev: true
2506 | resolution:
2507 | integrity: sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==
2508 | /restore-cursor/2.0.0:
2509 | dependencies:
2510 | onetime: 2.0.1
2511 | signal-exit: 3.0.2
2512 | dev: true
2513 | engines:
2514 | node: '>=4'
2515 | resolution:
2516 | integrity: sha1-n37ih/gv0ybU/RYpI9YhKe7g368=
2517 | /ret/0.1.15:
2518 | dev: true
2519 | engines:
2520 | node: '>=0.12'
2521 | resolution:
2522 | integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==
2523 | /rimraf/2.6.3:
2524 | dependencies:
2525 | glob: 7.1.4
2526 | dev: true
2527 | hasBin: true
2528 | resolution:
2529 | integrity: sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==
2530 | /run-async/2.3.0:
2531 | dependencies:
2532 | is-promise: 2.1.0
2533 | dev: true
2534 | engines:
2535 | node: '>=0.12.0'
2536 | resolution:
2537 | integrity: sha1-A3GrSuC91yDUFm19/aZP96RFpsA=
2538 | /rxjs/6.5.3:
2539 | dependencies:
2540 | tslib: 1.10.0
2541 | dev: true
2542 | engines:
2543 | npm: '>=2.0.0'
2544 | resolution:
2545 | integrity: sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==
2546 | /safe-buffer/5.1.2:
2547 | resolution:
2548 | integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
2549 | /safe-buffer/5.2.0:
2550 | dev: true
2551 | resolution:
2552 | integrity: sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==
2553 | /safe-regex/1.1.0:
2554 | dependencies:
2555 | ret: 0.1.15
2556 | dev: true
2557 | resolution:
2558 | integrity: sha1-QKNmnzsHfR6UPURinhV91IAjvy4=
2559 | /safer-buffer/2.1.2:
2560 | resolution:
2561 | integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
2562 | /semver-diff/2.1.0:
2563 | dependencies:
2564 | semver: 5.7.1
2565 | dev: true
2566 | engines:
2567 | node: '>=0.10.0'
2568 | resolution:
2569 | integrity: sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=
2570 | /semver/5.7.1:
2571 | dev: true
2572 | hasBin: true
2573 | resolution:
2574 | integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
2575 | /semver/6.3.0:
2576 | dev: true
2577 | hasBin: true
2578 | resolution:
2579 | integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
2580 | /send/0.17.1:
2581 | dependencies:
2582 | debug: 2.6.9
2583 | depd: 1.1.2
2584 | destroy: 1.0.4
2585 | encodeurl: 1.0.2
2586 | escape-html: 1.0.3
2587 | etag: 1.8.1
2588 | fresh: 0.5.2
2589 | http-errors: 1.7.3
2590 | mime: 1.6.0
2591 | ms: 2.1.1
2592 | on-finished: 2.3.0
2593 | range-parser: 1.2.1
2594 | statuses: 1.5.0
2595 | dev: false
2596 | engines:
2597 | node: '>= 0.8.0'
2598 | resolution:
2599 | integrity: sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==
2600 | /serve-static/1.14.1:
2601 | dependencies:
2602 | encodeurl: 1.0.2
2603 | escape-html: 1.0.3
2604 | parseurl: 1.3.3
2605 | send: 0.17.1
2606 | dev: false
2607 | engines:
2608 | node: '>= 0.8.0'
2609 | resolution:
2610 | integrity: sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==
2611 | /set-value/2.0.1:
2612 | dependencies:
2613 | extend-shallow: 2.0.1
2614 | is-extendable: 0.1.1
2615 | is-plain-object: 2.0.4
2616 | split-string: 3.1.0
2617 | dev: true
2618 | engines:
2619 | node: '>=0.10.0'
2620 | resolution:
2621 | integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==
2622 | /setprototypeof/1.1.1:
2623 | dev: false
2624 | resolution:
2625 | integrity: sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==
2626 | /shebang-command/1.2.0:
2627 | dependencies:
2628 | shebang-regex: 1.0.0
2629 | dev: true
2630 | engines:
2631 | node: '>=0.10.0'
2632 | resolution:
2633 | integrity: sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=
2634 | /shebang-regex/1.0.0:
2635 | dev: true
2636 | engines:
2637 | node: '>=0.10.0'
2638 | resolution:
2639 | integrity: sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=
2640 | /signal-exit/3.0.2:
2641 | dev: true
2642 | resolution:
2643 | integrity: sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=
2644 | /slice-ansi/2.1.0:
2645 | dependencies:
2646 | ansi-styles: 3.2.1
2647 | astral-regex: 1.0.0
2648 | is-fullwidth-code-point: 2.0.0
2649 | dev: true
2650 | engines:
2651 | node: '>=6'
2652 | resolution:
2653 | integrity: sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==
2654 | /snapdragon-node/2.1.1:
2655 | dependencies:
2656 | define-property: 1.0.0
2657 | isobject: 3.0.1
2658 | snapdragon-util: 3.0.1
2659 | dev: true
2660 | engines:
2661 | node: '>=0.10.0'
2662 | resolution:
2663 | integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==
2664 | /snapdragon-util/3.0.1:
2665 | dependencies:
2666 | kind-of: 3.2.2
2667 | dev: true
2668 | engines:
2669 | node: '>=0.10.0'
2670 | resolution:
2671 | integrity: sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==
2672 | /snapdragon/0.8.2:
2673 | dependencies:
2674 | base: 0.11.2
2675 | debug: 2.6.9
2676 | define-property: 0.2.5
2677 | extend-shallow: 2.0.1
2678 | map-cache: 0.2.2
2679 | source-map: 0.5.7
2680 | source-map-resolve: 0.5.2
2681 | use: 3.1.1
2682 | dev: true
2683 | engines:
2684 | node: '>=0.10.0'
2685 | resolution:
2686 | integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==
2687 | /socket.io-adapter/1.1.1:
2688 | dev: false
2689 | resolution:
2690 | integrity: sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs=
2691 | /socket.io-client/2.3.0:
2692 | dependencies:
2693 | backo2: 1.0.2
2694 | base64-arraybuffer: 0.1.5
2695 | component-bind: 1.0.0
2696 | component-emitter: 1.2.1
2697 | debug: 4.1.1
2698 | engine.io-client: 3.4.0
2699 | has-binary2: 1.0.3
2700 | has-cors: 1.1.0
2701 | indexof: 0.0.1
2702 | object-component: 0.0.3
2703 | parseqs: 0.0.5
2704 | parseuri: 0.0.5
2705 | socket.io-parser: 3.3.0
2706 | to-array: 0.1.4
2707 | dev: false
2708 | resolution:
2709 | integrity: sha512-cEQQf24gET3rfhxZ2jJ5xzAOo/xhZwK+mOqtGRg5IowZsMgwvHwnf/mCRapAAkadhM26y+iydgwsXGObBB5ZdA==
2710 | /socket.io-parser/3.3.0:
2711 | dependencies:
2712 | component-emitter: 1.2.1
2713 | debug: 3.1.0
2714 | isarray: 2.0.1
2715 | dev: false
2716 | resolution:
2717 | integrity: sha512-hczmV6bDgdaEbVqhAeVMM/jfUfzuEZHsQg6eOmLgJht6G3mPKMxYm75w2+qhAQZ+4X+1+ATZ+QFKeOZD5riHng==
2718 | /socket.io-parser/3.4.0:
2719 | dependencies:
2720 | component-emitter: 1.2.1
2721 | debug: 4.1.1
2722 | isarray: 2.0.1
2723 | dev: false
2724 | resolution:
2725 | integrity: sha512-/G/VOI+3DBp0+DJKW4KesGnQkQPFmUCbA/oO2QGT6CWxU7hLGWqU3tyuzeSK/dqcyeHsQg1vTe9jiZI8GU9SCQ==
2726 | /socket.io/2.3.0:
2727 | dependencies:
2728 | debug: 4.1.1
2729 | engine.io: 3.4.0
2730 | has-binary2: 1.0.3
2731 | socket.io-adapter: 1.1.1
2732 | socket.io-client: 2.3.0
2733 | socket.io-parser: 3.4.0
2734 | dev: false
2735 | resolution:
2736 | integrity: sha512-2A892lrj0GcgR/9Qk81EaY2gYhCBxurV0PfmmESO6p27QPrUK1J3zdns+5QPqvUYK2q657nSj0guoIil9+7eFg==
2737 | /source-map-resolve/0.5.2:
2738 | dependencies:
2739 | atob: 2.1.2
2740 | decode-uri-component: 0.2.0
2741 | resolve-url: 0.2.1
2742 | source-map-url: 0.4.0
2743 | urix: 0.1.0
2744 | dev: true
2745 | resolution:
2746 | integrity: sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==
2747 | /source-map-url/0.4.0:
2748 | dev: true
2749 | resolution:
2750 | integrity: sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=
2751 | /source-map/0.5.7:
2752 | dev: true
2753 | engines:
2754 | node: '>=0.10.0'
2755 | resolution:
2756 | integrity: sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
2757 | /spdx-correct/3.1.0:
2758 | dependencies:
2759 | spdx-expression-parse: 3.0.0
2760 | spdx-license-ids: 3.0.5
2761 | dev: true
2762 | resolution:
2763 | integrity: sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==
2764 | /spdx-exceptions/2.2.0:
2765 | dev: true
2766 | resolution:
2767 | integrity: sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==
2768 | /spdx-expression-parse/3.0.0:
2769 | dependencies:
2770 | spdx-exceptions: 2.2.0
2771 | spdx-license-ids: 3.0.5
2772 | dev: true
2773 | resolution:
2774 | integrity: sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==
2775 | /spdx-license-ids/3.0.5:
2776 | dev: true
2777 | resolution:
2778 | integrity: sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==
2779 | /split-string/3.1.0:
2780 | dependencies:
2781 | extend-shallow: 3.0.2
2782 | dev: true
2783 | engines:
2784 | node: '>=0.10.0'
2785 | resolution:
2786 | integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==
2787 | /sprintf-js/1.0.3:
2788 | dev: true
2789 | resolution:
2790 | integrity: sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
2791 | /static-extend/0.1.2:
2792 | dependencies:
2793 | define-property: 0.2.5
2794 | object-copy: 0.1.0
2795 | dev: true
2796 | engines:
2797 | node: '>=0.10.0'
2798 | resolution:
2799 | integrity: sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=
2800 | /statuses/1.5.0:
2801 | dev: false
2802 | engines:
2803 | node: '>= 0.6'
2804 | resolution:
2805 | integrity: sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=
2806 | /string-width/2.1.1:
2807 | dependencies:
2808 | is-fullwidth-code-point: 2.0.0
2809 | strip-ansi: 4.0.0
2810 | dev: true
2811 | engines:
2812 | node: '>=4'
2813 | resolution:
2814 | integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==
2815 | /string-width/3.1.0:
2816 | dependencies:
2817 | emoji-regex: 7.0.3
2818 | is-fullwidth-code-point: 2.0.0
2819 | strip-ansi: 5.2.0
2820 | dev: true
2821 | engines:
2822 | node: '>=6'
2823 | resolution:
2824 | integrity: sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==
2825 | /string.prototype.trimleft/2.1.0:
2826 | dependencies:
2827 | define-properties: 1.1.3
2828 | function-bind: 1.1.1
2829 | dev: true
2830 | engines:
2831 | node: '>= 0.4'
2832 | resolution:
2833 | integrity: sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==
2834 | /string.prototype.trimright/2.1.0:
2835 | dependencies:
2836 | define-properties: 1.1.3
2837 | function-bind: 1.1.1
2838 | dev: true
2839 | engines:
2840 | node: '>= 0.4'
2841 | resolution:
2842 | integrity: sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==
2843 | /string_decoder/1.1.1:
2844 | dependencies:
2845 | safe-buffer: 5.1.2
2846 | dev: true
2847 | resolution:
2848 | integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
2849 | /strip-ansi/4.0.0:
2850 | dependencies:
2851 | ansi-regex: 3.0.0
2852 | dev: true
2853 | engines:
2854 | node: '>=4'
2855 | resolution:
2856 | integrity: sha1-qEeQIusaw2iocTibY1JixQXuNo8=
2857 | /strip-ansi/5.2.0:
2858 | dependencies:
2859 | ansi-regex: 4.1.0
2860 | dev: true
2861 | engines:
2862 | node: '>=6'
2863 | resolution:
2864 | integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==
2865 | /strip-bom/3.0.0:
2866 | dev: true
2867 | engines:
2868 | node: '>=4'
2869 | resolution:
2870 | integrity: sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=
2871 | /strip-eof/1.0.0:
2872 | dev: true
2873 | engines:
2874 | node: '>=0.10.0'
2875 | resolution:
2876 | integrity: sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=
2877 | /strip-json-comments/2.0.1:
2878 | dev: true
2879 | engines:
2880 | node: '>=0.10.0'
2881 | resolution:
2882 | integrity: sha1-PFMZQukIwml8DsNEhYwobHygpgo=
2883 | /strip-json-comments/3.0.1:
2884 | dev: true
2885 | engines:
2886 | node: '>=8'
2887 | resolution:
2888 | integrity: sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==
2889 | /supports-color/5.5.0:
2890 | dependencies:
2891 | has-flag: 3.0.0
2892 | dev: true
2893 | engines:
2894 | node: '>=4'
2895 | resolution:
2896 | integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
2897 | /table/5.4.6:
2898 | dependencies:
2899 | ajv: 6.10.2
2900 | lodash: 4.17.15
2901 | slice-ansi: 2.1.0
2902 | string-width: 3.1.0
2903 | dev: true
2904 | engines:
2905 | node: '>=6.0.0'
2906 | resolution:
2907 | integrity: sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==
2908 | /term-size/1.2.0:
2909 | dependencies:
2910 | execa: 0.7.0
2911 | dev: true
2912 | engines:
2913 | node: '>=4'
2914 | resolution:
2915 | integrity: sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=
2916 | /text-table/0.2.0:
2917 | dev: true
2918 | resolution:
2919 | integrity: sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=
2920 | /through/2.3.8:
2921 | dev: true
2922 | resolution:
2923 | integrity: sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
2924 | /timed-out/4.0.1:
2925 | dev: true
2926 | engines:
2927 | node: '>=0.10.0'
2928 | resolution:
2929 | integrity: sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=
2930 | /tmp/0.0.33:
2931 | dependencies:
2932 | os-tmpdir: 1.0.2
2933 | dev: true
2934 | engines:
2935 | node: '>=0.6.0'
2936 | resolution:
2937 | integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==
2938 | /to-array/0.1.4:
2939 | dev: false
2940 | resolution:
2941 | integrity: sha1-F+bBH3PdTz10zaek/zI46a2b+JA=
2942 | /to-object-path/0.3.0:
2943 | dependencies:
2944 | kind-of: 3.2.2
2945 | dev: true
2946 | engines:
2947 | node: '>=0.10.0'
2948 | resolution:
2949 | integrity: sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=
2950 | /to-regex-range/2.1.1:
2951 | dependencies:
2952 | is-number: 3.0.0
2953 | repeat-string: 1.6.1
2954 | dev: true
2955 | engines:
2956 | node: '>=0.10.0'
2957 | resolution:
2958 | integrity: sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=
2959 | /to-regex/3.0.2:
2960 | dependencies:
2961 | define-property: 2.0.2
2962 | extend-shallow: 3.0.2
2963 | regex-not: 1.0.2
2964 | safe-regex: 1.1.0
2965 | dev: true
2966 | engines:
2967 | node: '>=0.10.0'
2968 | resolution:
2969 | integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==
2970 | /toidentifier/1.0.0:
2971 | dev: false
2972 | engines:
2973 | node: '>=0.6'
2974 | resolution:
2975 | integrity: sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==
2976 | /touch/3.1.0:
2977 | dependencies:
2978 | nopt: 1.0.10
2979 | dev: true
2980 | hasBin: true
2981 | resolution:
2982 | integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==
2983 | /tslib/1.10.0:
2984 | dev: true
2985 | resolution:
2986 | integrity: sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==
2987 | /type-check/0.3.2:
2988 | dependencies:
2989 | prelude-ls: 1.1.2
2990 | dev: true
2991 | engines:
2992 | node: '>= 0.8.0'
2993 | resolution:
2994 | integrity: sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=
2995 | /type-is/1.6.18:
2996 | dependencies:
2997 | media-typer: 0.3.0
2998 | mime-types: 2.1.24
2999 | dev: false
3000 | engines:
3001 | node: '>= 0.6'
3002 | resolution:
3003 | integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==
3004 | /uid2/0.0.3:
3005 | dev: false
3006 | resolution:
3007 | integrity: sha1-SDEm4Rd03y9xuLY53NeZw3YWK4I=
3008 | /undefsafe/2.0.2:
3009 | dependencies:
3010 | debug: 2.6.9
3011 | dev: true
3012 | resolution:
3013 | integrity: sha1-Il9rngM3Zj4Njnz9aG/Cg2zKznY=
3014 | /union-value/1.0.1:
3015 | dependencies:
3016 | arr-union: 3.1.0
3017 | get-value: 2.0.6
3018 | is-extendable: 0.1.1
3019 | set-value: 2.0.1
3020 | dev: true
3021 | engines:
3022 | node: '>=0.10.0'
3023 | resolution:
3024 | integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==
3025 | /unique-string/1.0.0:
3026 | dependencies:
3027 | crypto-random-string: 1.0.0
3028 | dev: true
3029 | engines:
3030 | node: '>=4'
3031 | resolution:
3032 | integrity: sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=
3033 | /unpipe/1.0.0:
3034 | dev: false
3035 | engines:
3036 | node: '>= 0.8'
3037 | resolution:
3038 | integrity: sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=
3039 | /unset-value/1.0.0:
3040 | dependencies:
3041 | has-value: 0.3.1
3042 | isobject: 3.0.1
3043 | dev: true
3044 | engines:
3045 | node: '>=0.10.0'
3046 | resolution:
3047 | integrity: sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=
3048 | /unzip-response/2.0.1:
3049 | dev: true
3050 | engines:
3051 | node: '>=4'
3052 | resolution:
3053 | integrity: sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=
3054 | /upath/1.2.0:
3055 | dev: true
3056 | engines:
3057 | node: '>=4'
3058 | resolution:
3059 | integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==
3060 | /update-notifier/2.5.0:
3061 | dependencies:
3062 | boxen: 1.3.0
3063 | chalk: 2.4.2
3064 | configstore: 3.1.2
3065 | import-lazy: 2.1.0
3066 | is-ci: 1.2.1
3067 | is-installed-globally: 0.1.0
3068 | is-npm: 1.0.0
3069 | latest-version: 3.1.0
3070 | semver-diff: 2.1.0
3071 | xdg-basedir: 3.0.0
3072 | dev: true
3073 | engines:
3074 | node: '>=4'
3075 | resolution:
3076 | integrity: sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==
3077 | /uri-js/4.2.2:
3078 | dependencies:
3079 | punycode: 2.1.1
3080 | dev: true
3081 | resolution:
3082 | integrity: sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==
3083 | /urix/0.1.0:
3084 | dev: true
3085 | resolution:
3086 | integrity: sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=
3087 | /url-parse-lax/1.0.0:
3088 | dependencies:
3089 | prepend-http: 1.0.4
3090 | dev: true
3091 | engines:
3092 | node: '>=0.10.0'
3093 | resolution:
3094 | integrity: sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=
3095 | /use/3.1.1:
3096 | dev: true
3097 | engines:
3098 | node: '>=0.10.0'
3099 | resolution:
3100 | integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==
3101 | /util-deprecate/1.0.2:
3102 | dev: true
3103 | resolution:
3104 | integrity: sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
3105 | /utils-merge/1.0.1:
3106 | dev: false
3107 | engines:
3108 | node: '>= 0.4.0'
3109 | resolution:
3110 | integrity: sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=
3111 | /v8-compile-cache/2.1.0:
3112 | dev: true
3113 | resolution:
3114 | integrity: sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==
3115 | /validate-npm-package-license/3.0.4:
3116 | dependencies:
3117 | spdx-correct: 3.1.0
3118 | spdx-expression-parse: 3.0.0
3119 | dev: true
3120 | resolution:
3121 | integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==
3122 | /vary/1.1.2:
3123 | dev: false
3124 | engines:
3125 | node: '>= 0.8'
3126 | resolution:
3127 | integrity: sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=
3128 | /which/1.3.1:
3129 | dependencies:
3130 | isexe: 2.0.0
3131 | dev: true
3132 | hasBin: true
3133 | resolution:
3134 | integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==
3135 | /widest-line/2.0.1:
3136 | dependencies:
3137 | string-width: 2.1.1
3138 | dev: true
3139 | engines:
3140 | node: '>=4'
3141 | resolution:
3142 | integrity: sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==
3143 | /wordwrap/1.0.0:
3144 | dev: true
3145 | resolution:
3146 | integrity: sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=
3147 | /wrappy/1.0.2:
3148 | dev: true
3149 | resolution:
3150 | integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
3151 | /write-file-atomic/2.4.3:
3152 | dependencies:
3153 | graceful-fs: 4.2.2
3154 | imurmurhash: 0.1.4
3155 | signal-exit: 3.0.2
3156 | dev: true
3157 | resolution:
3158 | integrity: sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==
3159 | /write/1.0.3:
3160 | dependencies:
3161 | mkdirp: 0.5.1
3162 | dev: true
3163 | engines:
3164 | node: '>=4'
3165 | resolution:
3166 | integrity: sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==
3167 | /ws/6.1.4:
3168 | dependencies:
3169 | async-limiter: 1.0.1
3170 | dev: false
3171 | resolution:
3172 | integrity: sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA==
3173 | /ws/7.1.2:
3174 | dependencies:
3175 | async-limiter: 1.0.1
3176 | dev: false
3177 | resolution:
3178 | integrity: sha512-gftXq3XI81cJCgkUiAVixA0raD9IVmXqsylCrjRygw4+UOOGzPoxnQ6r/CnVL9i+mDncJo94tSkyrtuuQVBmrg==
3179 | /xdg-basedir/3.0.0:
3180 | dev: true
3181 | engines:
3182 | node: '>=4'
3183 | resolution:
3184 | integrity: sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=
3185 | /xmlhttprequest-ssl/1.5.5:
3186 | dev: false
3187 | engines:
3188 | node: '>=0.4.0'
3189 | resolution:
3190 | integrity: sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=
3191 | /yallist/2.1.2:
3192 | dev: true
3193 | resolution:
3194 | integrity: sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=
3195 | /yeast/0.1.2:
3196 | dev: false
3197 | resolution:
3198 | integrity: sha1-AI4G2AlDIMNy28L47XagymyKxBk=
3199 | specifiers:
3200 | cors: ^2.8.5
3201 | dotenv: ^8.1.0
3202 | eslint: ^6.4.0
3203 | eslint-config-airbnb-base: ^14.0.0
3204 | eslint-plugin-import: ^2.18.2
3205 | express: ^4.17.1
3206 | morgan: ^1.9.1
3207 | node-fetch: ^2.6.0
3208 | nodemon: ^1.19.2
3209 | passport: ^0.4.0
3210 | passport-google-oauth20: ^2.0.0
3211 | socket.io: ^2.2.0
3212 |
--------------------------------------------------------------------------------
/server/public/callback.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | Logging in...
7 |
8 |
16 |
17 |
18 | Logging in...
19 |
26 |
27 |
--------------------------------------------------------------------------------
/server/src/followMessages.js:
--------------------------------------------------------------------------------
1 | module.exports = [
2 | '{{username}} just followed - glhf!',
3 | '{{username}} just followed. Everyone, look busy!',
4 | '{{username}} followed. You must construct additional pylons.',
5 | 'Ermagherd. {{username}} followed.',
6 | 'Welcome, {{username}}. Stay awhile and listen.',
7 | 'Welcome, {{username}}. We were expecting you ( ͡° ͜ʖ ͡°)',
8 | 'Welcome, {{username}}. We hope you brought pizza.',
9 | 'A wild {{username}} followed.',
10 | 'Swoooosh. {{username}} just followed.',
11 | 'Brace yourselves. {{username}} just followed.',
12 | '{{username}} just followed. Hide your bananas.',
13 | 'Challenger approaching - {{username}} has followed!',
14 | 'Never gonna give {{username}} up. Never gonna let {{username}} down.',
15 | 'Hey! Listen! {{username}} has followed!',
16 | "We've been expecting you {{username}}",
17 | "{{username}} has followed! It's super effective!",
18 | 'Cheers, love! {{username}} followed!',
19 | '{{username}} followed, as the prophecy foretold.',
20 | 'Roses are red, violets are blue, {{username}} followed.',
21 | ];
22 |
--------------------------------------------------------------------------------
/server/src/index.js:
--------------------------------------------------------------------------------
1 | const express = require('express');
2 | const morgan = require('morgan');
3 | const cors = require('cors');
4 | const http = require('http');
5 | const socketIO = require('socket.io');
6 |
7 | require('dotenv').config();
8 |
9 | const app = express();
10 | const server = http.Server(app);
11 | const io = socketIO(server);
12 |
13 | const { router } = require('./routes');
14 | const socket = require('./socket');
15 |
16 | socket.setIO(io);
17 |
18 | app.use(morgan('dev'));
19 | app.use(cors());
20 |
21 | app.get('/', (req, res) => {
22 | res.json({
23 | message: '🦄🌈✨Hello World! 🌈✨🦄',
24 | });
25 | });
26 |
27 | app.use(express.static('public'));
28 | app.use('/', router);
29 |
30 | function notFound(req, res, next) {
31 | res.status(404);
32 | const error = new Error(`Not Found - ${req.originalUrl}`);
33 | next(error);
34 | }
35 |
36 | // eslint-disable-next-line
37 | function errorHandler(err, req, res, next) {
38 | res.status(res.statusCode || 500);
39 | res.json({
40 | message: err.message,
41 | stack: err.stack,
42 | });
43 | }
44 |
45 | app.use(notFound);
46 | app.use(errorHandler);
47 |
48 | const port = process.env.PORT || 5000;
49 | server.listen(port, () => {
50 | console.log('Listening on port', port);
51 | });
52 |
--------------------------------------------------------------------------------
/server/src/routes/index.js:
--------------------------------------------------------------------------------
1 | const express = require('express');
2 | const fetch = require('node-fetch');
3 | const tmi = require('tmi.js');
4 | const TPS = require('twitchps');
5 | const Filter = require('bad-words');
6 | const db = require('monk')('localhost/chat-manager');
7 |
8 | const events = db.get('events');
9 |
10 | const socket = require('../socket');
11 | const followMessages = require('../followMessages');
12 |
13 | const router = express.Router();
14 |
15 | // const MESSAGES_URL = 'https://www.googleapis.com/youtube/v3/liveChat/messages';
16 | const listening = {};
17 | const badWordFilter = new Filter({ placeHolder: '💚' });
18 |
19 | const getRandomFollowMessage = () => followMessages[
20 | Math.floor(Math.random() * followMessages.length)
21 | ];
22 |
23 | const youtubeChannelEmotes = {
24 | ':cdgSeedling:': 'https://yt3.ggpht.com/TZQBMEOI6HJIvCAdr_0lt-Y9RuibZpDCb-Gih7xxY2vBVZ93a4c_hKcL5GRKafLaIPvCee3ar3c=w24-h24-c-k-nd',
25 | ':cdgCJsmile:': 'https://yt3.ggpht.com/EHQaFtWsiqyoA8I-xDEUk_GASHbF-IzTolMXctwNXeu9JZ5br9quyWqhY8YOeVWRYKVa__h1ZHw=w24-h24-c-k-nd',
26 | ':cdgCJthink:': 'https://yt3.ggpht.com/A2rEpbhkn2z3Em8aOg1_8dVdvOR_iR7Bd9ChVgtLzfhLOh76jb_KIJj2fJNCRstazTm9fNBWC6Y=w24-h24-c-k-nd',
27 | ':cdgCJpixel:': 'https://yt3.ggpht.com/8VysDeeBLAo5QRLhmka6H0Z9cIuFISC4O6HswiYqHEnhmZAlGqOHN_pM2kyhU04qL79XkOmmvQ=w24-h24-c-k-nd',
28 | ':cdgAlca:': 'https://yt3.ggpht.com/B4CCyqp0k6R6ktde8iHY1w_MJz2qlffNyGH7eJQFP-l2HjBwSGd-SHWvzS8VIiwM-A_zdP6GIjg',
29 | ':cdgCJS:': 'https://yt3.ggpht.com/uVcMtvwFgMErnBjl9C5RA5dIsxyfEH2jhXKvSyHbSdjQUd-IUF68xpI9DJ8N8VJkz704ln1ClQ',
30 | ':cdgBJS:': 'https://yt3.ggpht.com/i5WW1DZXRiQLv4d813kt_4GDYF6OJ5n59vMdq2QQ7eFC-dcFOkWAVn5q1JtJjSTnEsQ2hvPRPg',
31 | ':cdgYerba:': 'https://yt3.ggpht.com/-7EPZ9U7Jhxa0j9ATpaxVPIaBW_h_IFMA8e6-ggm6ed6Cnk9PJ6qQ3oJDbjq3gnFdbtiaoYSQ6s=w48-h48-c-k-nd',
32 | };
33 | const youtubeEmotes = {
34 | ':yt:': 'https://yt3.ggpht.com/m6yqTzfmHlsoKKEZRSZCkqf6cGSeHtStY4rIeeXLAk4N9GY_yw3dizdZoxTrjLhlY4r_rkz3GA=w24-h24-c-k-nd',
35 | ':oops:': 'https://yt3.ggpht.com/qByNS7xmuQXsb_5hxW2ggxwQZRN8-biWVnnKuL5FK1zudxIeim48zRVPk6DRq_HgaeKltHhm=w24-h24-c-k-nd',
36 | ':buffering:': 'https://yt3.ggpht.com/foWgzjN0ggMAA0CzDPfPZGyuGwv_7D7Nf6FGLAiomW5RRXj0Fs2lDqs2U6L52Z4J2Zb-D5tCUAA=w24-h24-c-k-nd',
37 | ':stayhome:': 'https://yt3.ggpht.com/u3QDxda8o4jrk_b01YtJYKb57l8Zw8ks8mCwGkiZ5hC5cQP_iszbsggxIWquZhuLRBzl5IEM2w=w24-h24-c-k-nd',
38 | ':dothefive:': 'https://yt3.ggpht.com/ktU04FFgK_a6yaXCS1US-ReFkLjD22XllcIMOyBRHuYKLsrxpVxsauV1gSC2RPraMJWXpWcY=w24-h24-c-k-nd',
39 | ':elbowbump:': 'https://yt3.ggpht.com/gt39CIfizoIAce9a8IzjfrADV5CjTbSyFKUlLMXzYILxJRjwAgYQQJ9PXXxnRvrnTec7ZpfHN4k=w24-h24-c-k-nd',
40 | ':goodvibes:': 'https://yt3.ggpht.com/6LPOiCw9bYr3ZXe8AhUoIMpDe_0BglC4mBmi-uC4kLDqDIuPu4J3ErgV0lEhgzXiBluq-I8j=w24-h24-c-k-nd',
41 | ':thanksdoc:': 'https://yt3.ggpht.com/Av7Vf8FxIp0_dQg4cJrPcGmmL7v9RXraOXMp0ZBDN693ewoMTHbbS7D7V3GXpbtZPSNcRLHTQw=w24-h24-c-k-nd',
42 | ':videocall:': 'https://yt3.ggpht.com/bP-4yir3xZBWh-NKO4eGJJglr8m4dRnHrAKAXikaOJ0E5YFNkJ6IyAz3YhHMyukQ1kJNgQAo=w24-h24-c-k-nd',
43 | ':virtualhug:': 'https://yt3.ggpht.com/-o0Di2mE5oaqf_lb_RI3igd0fptmldMWF9kyQpqKWkdAd7M4cT5ZKzDwlmSSXdcBp3zVLJ41yg=w24-h24-c-k-nd',
44 | ':yougotthis:': 'https://yt3.ggpht.com/WxLUGtJzyLd4dcGaWnmcQnw9lTu9BW3_pEuCp6kcM2pxF5p5J28PvcYIXWh6uCm78LxGJVGn9g=w24-h24-c-k-nd',
45 | ':sanitizer:': 'https://yt3.ggpht.com/4PaPj_5jR1lkidYakZ4EkxVqNr0Eqp4g0xvlYt_gZqjTtVeyHBszqf57nB9s6uLh7d2QtEhEWEc=w24-h24-c-k-nd',
46 | ':takeout:': 'https://yt3.ggpht.com/ehUiXdRyvel0hba-BopQoDWTvM9ogZcMPaaAeR6IA9wkocdG21aFVN_IylxRGHtl2mE6L9jg1Do=w24-h24-c-k-nd',
47 | ':hydrate:': 'https://yt3.ggpht.com/Plqt3RM7NBy-R_eA90cIjzMEzo8guwE0KqJ9QBeCkPEWO7FvUqKU_Vq03Lmv9XxMrG6A3Ouwpg=w24-h24-c-k-nd',
48 | ':chillwcat:': 'https://yt3.ggpht.com/ZN5h05TnuFQmbzgGvIfk3bgrV-_Wp8bAbecOqw92s2isI6GLHbYjTyZjcqf0rKQ5t4jBtlumzw=w24-h24-c-k-nd',
49 | ':chillwdog:': 'https://yt3.ggpht.com/jiaOCnfLX0rqed1sISxULaO7T-ktq2GEPizX9snaxvMLxQOMmWXMmAVGyIbYeFS2IvrMpxvFcQ=w24-h24-c-k-nd',
50 | ':elbowcough:': 'https://yt3.ggpht.com/kWObU3wBMdHS43q6-ib2KJ-iC5tWqe7QcEITaNApbXEZfrik9E57_ve_BEPHO86z4Xrv8ikMdW0=w24-h24-c-k-nd',
51 | ':learning:': 'https://yt3.ggpht.com/LiS1vw8KUXmczimKGfA-toRYXOcV1o-9aGSNRF0dGLk15Da2KTAsU-DXkIao-S7-kCkSnJwt=w24-h24-c-k-nd',
52 | ':washhands:': 'https://yt3.ggpht.com/66Fn-0wiOmLDkoKk4FSa9vD0yymtWEulbbQK2x-kTBswQ2auer_2ftvmrJGyMMoqEGNjJtipBA=w24-h24-c-k-nd',
53 | ':socialdist:': 'https://yt3.ggpht.com/0WD780vTqUcS0pFq423D8WRuA_T8NKdTbRztChITI9jgOqOxD2r6dthbu86P6fIggDR6omAPfnQ=w24-h24-c-k-nd',
54 | ':shelterin:': 'https://yt3.ggpht.com/KgaktgJ3tmEFB-gMtjUcuHd6UKq50b-S3PbHEOSUbJG7UddPoJSmrIzysXA77jJp5oRNLWG84Q=w24-h24-c-k-nd',
55 | };
56 |
57 | const youtubeEmoteRegex = new RegExp(Object.keys(youtubeEmotes).join('|'), 'g');
58 | const youtubeChannelEmoteRegex = new RegExp(Object.keys(youtubeChannelEmotes).join('|'), 'g');
59 |
60 | let lastUpdated = {};
61 |
62 | const bttvEmotes = {};
63 | let bttvRegex;
64 | const ffzEmotes = {};
65 | let ffzRegex;
66 |
67 | async function getBttvEmotes() {
68 | const bttvResponse = await fetch('https://api.betterttv.net/3/cached/emotes/global');
69 | let emotes = await bttvResponse.json();
70 | const bttvChannelResponse = await fetch('https://api.betterttv.net/3/cached/users/twitch/413856795');
71 | const { channelEmotes, sharedEmotes } = await bttvChannelResponse.json();
72 | emotes = emotes.concat(channelEmotes).concat(sharedEmotes);
73 | let regexStr = '';
74 | emotes.forEach(({ code, id }, i) => {
75 | bttvEmotes[code] = id;
76 | regexStr += code.replace(/\(/, '\\(').replace(/\)/, '\\)') + (i === emotes.length - 1 ? '' : '|');
77 | });
78 | bttvRegex = new RegExp(`(?<=^|\\s)(${regexStr})(?=$|\\s)`, 'g');
79 | console.log(bttvEmotes);
80 | console.log(bttvRegex);
81 | }
82 |
83 | async function getFfzEmotes() {
84 | const ffzResponse = await fetch('https://api.frankerfacez.com/v1/set/global');
85 | const ffzChannelResponse = await fetch('https://api.frankerfacez.com/v1/room/codinggarden');
86 | const { sets } = await ffzResponse.json();
87 | const { sets: channelSets } = await ffzChannelResponse.json();
88 | let regexStr = '';
89 | const appendEmotes = ({ name, urls }, i, emotes) => {
90 | ffzEmotes[name] = `https:${Object.values(urls).pop()}`;
91 | regexStr += name + (i === emotes.length - 1 ? '' : '|');
92 | };
93 | sets[3].emoticons.forEach(appendEmotes);
94 | regexStr += '|';
95 | channelSets[609613].emoticons.forEach(appendEmotes);
96 | ffzRegex = new RegExp(`(?<=^|\\s)(${regexStr})(?=$|\\s)`, 'g');
97 | console.log(ffzEmotes);
98 | console.log(ffzRegex);
99 | }
100 |
101 | getBttvEmotes();
102 | getFfzEmotes();
103 |
104 | const countries = new Map();
105 |
106 | async function getCountries() {
107 | const response = await fetch('https://restcountries.eu/rest/v2/all?fields=alpha2Code;name;altSpellings;');
108 | const json = await response.json();
109 | json.forEach((country) => {
110 | const item = {
111 | code: country.alpha2Code.toLowerCase(),
112 | name: country.name,
113 | };
114 | countries.set(item.code, item);
115 | countries.set(country.name.toLowerCase(), item);
116 | country.altSpellings.forEach((alt) => {
117 | countries.set(alt.toLowerCase(), item);
118 | });
119 | });
120 | }
121 |
122 | getCountries();
123 |
124 | const twitchClient = new tmi.Client({
125 | options: {
126 | debug: true,
127 | },
128 | connection: {
129 | reconnect: true,
130 | secure: true,
131 | },
132 | channels: [process.env.TWITCH_CHANNEL],
133 | });
134 |
135 | async function updateDB(liveChat) {
136 | try {
137 | await events.update({
138 | id: liveChat.id,
139 | }, {
140 | $set: {
141 | ...liveChat,
142 | },
143 | });
144 | } catch (error) {
145 | console.error(error);
146 | }
147 | }
148 |
149 | // const init_topics = [{
150 | // topic: 'dashboard-activity-feed.413856795',
151 | // token: process.env.TWITCH_TOKEN,
152 | // }];
153 |
154 | const init_topics = [{
155 | topic: 'channel-points-channel-v1.413856795',
156 | token: process.env.TWITCH_TOKEN,
157 | }];
158 |
159 | async function getLatestMessages(io, liveChatId) {
160 | if (listening[liveChatId]) return;
161 | const nextPageToken = '';
162 | listening[liveChatId] = true;
163 |
164 | const params = new URLSearchParams({
165 | liveChatId,
166 | part: 'snippet,authorDetails',
167 | maxResults: 2000,
168 | key: process.env.GOOGLE_API_KEY,
169 | });
170 |
171 | const liveChat = await events.findOne({
172 | id: liveChatId,
173 | });
174 | delete liveChat._id;
175 |
176 | twitchClient.connect();
177 |
178 | twitchClient.on('messagedeleted', async (channel, username, deletedMessage, userstate) => {
179 | const id = userstate['target-msg-id'];
180 | delete liveChat.messagesById[id];
181 | const originalMessageIndex = liveChat.messages.findIndex((m) => m.id == id);
182 | liveChat.messages.splice(originalMessageIndex, 1);
183 | io.emit(`message-deleted/${liveChatId}`, id);
184 | await updateDB(liveChat);
185 | });
186 | const followAuthor = {
187 | channelId: 43,
188 | channelUrl: 'https://twitch.tv/samwisegardener',
189 | displayName: '👋 Follow 👋',
190 | isChatOwner: false,
191 | isChatModerator: false,
192 | isChatSponsor: false,
193 | isChatFounder: false,
194 | isVip: false,
195 | isVerified: false,
196 | profileImageUrl: 'https://i.imgur.com/rD7b0Ki.png',
197 | };
198 | twitchClient.on('message', async (channel, userstate, message) => {
199 | const channelId = userstate['user-id'];
200 | userstate.badges = userstate.badges || {};
201 | const isChatModerator = !!(userstate.badges.moderator || userstate.badges.broadcaster);
202 | const shouldUpdate = (message === '!refreshuser') && (isChatModerator || (!lastUpdated[channelId]) || (lastUpdated[channelId] < Date.now() - (30 * 60 * 1000)));
203 | if (shouldUpdate || !liveChat.authorsById[channelId]) {
204 | lastUpdated[channelId] = Date.now();
205 | const response = await fetch(`https://api.twitch.tv/kraken/users/${channelId}`, {
206 | method: 'GET',
207 | headers: {
208 | 'Client-ID': process.env.TWITCH_CLIENT_ID,
209 | Accept: 'application/vnd.twitchtv.v5+json',
210 | },
211 | });
212 |
213 | const json = await response.json();
214 | console.log(json);
215 | const {
216 | logo: profileImageUrl,
217 | } = json;
218 |
219 | const author = {
220 | channelId,
221 | channelUrl: `https://twitch.tv/${userstate.username}`,
222 | displayName: userstate['display-name'],
223 | isChatOwner: false,
224 | isChatModerator,
225 | isChatSponsor: !!(userstate.badges.founder || userstate.badges.subscriber),
226 | isChatFounder: !!userstate.badges.founder,
227 | isVip: !!userstate.badges.vip,
228 | isVerified: false,
229 | profileImageUrl,
230 | };
231 | liveChat.authorsById[channelId] = author;
232 | io.emit(`authors/${liveChatId}`, [author]);
233 | await updateDB(liveChat);
234 | } else {
235 | liveChat.authorsById[channelId] = {
236 | ...liveChat.authorsById[channelId],
237 | displayName: userstate['display-name'],
238 | isChatModerator: !!(userstate.badges.moderator || userstate.badges.broadcaster),
239 | isChatSponsor: !!(userstate.badges.founder || userstate.badges.subscriber),
240 | isChatFounder: !!userstate.badges.founder,
241 | isVip: !!userstate.badges.vip,
242 | };
243 | }
244 |
245 | if (message.startsWith('!team')) {
246 | const team = message.split(' ')[1];
247 | const author = liveChat.authorsById[channelId];
248 | if (team && author) {
249 | if (team === 'clear') {
250 | delete author.team;
251 | } else {
252 | author.team = team.toLowerCase();
253 | }
254 | io.emit(`authors/${liveChatId}`, [author]);
255 | await updateDB(liveChat);
256 | return;
257 | }
258 | }
259 |
260 | if (message.startsWith('!flag') || message.startsWith('!country')) {
261 | const lookup = message.split(' ')[1];
262 | const author = liveChat.authorsById[channelId];
263 | if (lookup && author) {
264 | if (lookup === 'clear') {
265 | delete author.country;
266 | delete author.country_name;
267 | } else {
268 | const country = countries.get(lookup.toLowerCase());
269 | if (country) {
270 | author.country = country.code;
271 | author.country_name = country.name;
272 | }
273 | }
274 | io.emit(`authors/${liveChatId}`, [author]);
275 | await updateDB(liveChat);
276 | return;
277 | }
278 | }
279 |
280 | if (userstate.username === 'streamlabs') {
281 | const followedUsername = (message.match(/Thank you for following on Twitch (.*)!/) || [])[1];
282 | if (followedUsername) {
283 | const contents = getRandomFollowMessage().replace(/\{\{username\}\}/g, followedUsername);
284 | const event = {
285 | id: userstate.id,
286 | message: contents,
287 | unfilteredMessage: contents,
288 | publishedAt: new Date(+userstate['tmi-sent-ts']),
289 | channelId,
290 | platform: 'twitch',
291 | author: followAuthor,
292 | highlighted: false,
293 | follow: true,
294 | };
295 | liveChat.messagesById[event.id] = event;
296 | liveChat.messages.push(event);
297 | io.emit(`messages/${liveChatId}`, [event]);
298 | return updateDB(liveChat);
299 | }
300 | }
301 |
302 | let messageWithEmotes = '';
303 | if (userstate.emotes) {
304 | const emoteIds = Object.keys(userstate.emotes);
305 | const emoteStart = emoteIds.reduce((starts, id) => {
306 | userstate.emotes[id].forEach((startEnd) => {
307 | const [start, end] = startEnd.split('-');
308 | starts[start] = {
309 | emoteUrl: ``,
310 | end,
311 | };
312 | });
313 | return starts;
314 | }, {});
315 | const parts = Array.from(message);
316 | for (let i = 0; i < parts.length; i++) {
317 | const char = parts[i];
318 | const emoteInfo = emoteStart[i];
319 | if (emoteInfo) {
320 | messageWithEmotes += emoteInfo.emoteUrl;
321 | i = emoteInfo.end;
322 | } else {
323 | messageWithEmotes += char;
324 | }
325 | }
326 | }
327 |
328 | const event = {
329 | id: userstate.id,
330 | message: (liveChat.authorsById[channelId].isChatModerator) ? (messageWithEmotes || message).replace(youtubeChannelEmoteRegex, (emote) => ``) : badWordFilter.clean(messageWithEmotes || message),
331 | unfilteredMessage: messageWithEmotes || message,
332 | publishedAt: new Date(+userstate['tmi-sent-ts']),
333 | channelId,
334 | platform: 'twitch',
335 | author: liveChat.authorsById[channelId],
336 | highlighted: userstate['msg-id'] === 'highlighted-message',
337 | };
338 |
339 | event.message = event.message.replace(bttvRegex, (name) => ``);
340 | event.message = event.message.replace(ffzRegex, (name) => ``);
341 | event.message = event.message.replace(youtubeEmoteRegex, (emote) => ``);
342 | // event.message = cleanMessage(event.message);
343 | liveChat.messagesById[event.id] = event;
344 | liveChat.messages.push(event);
345 | io.emit(`messages/${liveChatId}`, [event]);
346 | await updateDB(liveChat);
347 | });
348 |
349 | const pubSub = new TPS({
350 | init_topics,
351 | reconnect: true,
352 | debug: false,
353 | });
354 |
355 | const rewardAuthor = {
356 | channelId: 42,
357 | channelUrl: 'https://twitch.tv/samwisegardener',
358 | displayName: '🎉 Reward Redemption 🎉',
359 | isChatOwner: false,
360 | isChatModerator: false,
361 | isChatSponsor: false,
362 | isChatFounder: false,
363 | isVip: false,
364 | isVerified: false,
365 | profileImageUrl: 'https://i.imgur.com/pukCZL7.png',
366 | };
367 |
368 | pubSub.on('channel-points', async (data) => {
369 | try {
370 | const { redemption } = data;
371 | const message = `${redemption.user.display_name || redemption.user.login} has redeemed:
${redemption.reward.title}
${redemption.reward.prompt}
`;
372 | const event = {
373 | id: redemption.id,
374 | message,
375 | unfilteredMessage: message,
376 | publishedAt: new Date(data.timestamp),
377 | channelId: 42,
378 | platform: 'twitch',
379 | author: rewardAuthor,
380 | reward: true,
381 | rewardId: redemption.reward.id,
382 | };
383 | liveChat.messagesById[event.id] = event;
384 | liveChat.messages.push(event);
385 | io.emit(`messages/${liveChatId}`, [event]);
386 | await updateDB(liveChat);
387 | } catch (error) {
388 | console.log('error sending redemption message', data, error);
389 | }
390 | });
391 |
392 | // do {
393 | // let url = `${MESSAGES_URL}?${params}`;
394 | // if (nextPageToken) {
395 | // url += `&pageToken=${nextPageToken}`;
396 | // }
397 | // const response = await fetch(url);
398 | // const result = await response.json();
399 |
400 | // if (response.ok) {
401 | // const newAuthors = [];
402 |
403 | // if (result.items && result.items.length > 0) {
404 | // // eslint-disable-next-line
405 | // const newMessages = result.items.map((item) => {
406 | // const {
407 | // id,
408 | // snippet,
409 | // authorDetails,
410 | // } = item;
411 |
412 | // if (!liveChat.authorsById[authorDetails.channelId]) {
413 | // liveChat.authorsById[authorDetails.channelId] = authorDetails;
414 | // newAuthors.push(authorDetails);
415 | // }
416 |
417 | // const cleanMessage = badWordFilter.clean(snippet.displayMessage);
418 |
419 | // const message = {
420 | // id,
421 | // message: (authorDetails.isChatOwner || authorDetails.isChatModerator || authorDetails.isChatSponsor) ? cleanMessage.replace(youtubeChannelEmoteRegex, (emote) => ``) : cleanMessage,
422 | // unfilteredMessage: snippet.displayMessage,
423 | // publishedAt: snippet.publishedAt,
424 | // channelId: authorDetails.channelId,
425 | // platform: 'youtube',
426 | // author: authorDetails,
427 | // };
428 |
429 | // message.message = message.message.replace(bttvRegex, (name) => ``);
430 | // message.message = message.message.replace(ffzRegex, (name) => ``);
431 | // message.message = message.message.replace(youtubeEmoteRegex, (emote) => ``);
432 |
433 | // if (snippet.type === 'superChatEvent') {
434 | // message.superChat = snippet.superChatDetails;
435 | // }
436 |
437 | // liveChat.messagesById[id] = message;
438 | // return message;
439 | // });
440 |
441 | // if (newMessages.length > 0) {
442 | // newMessages.sort((a, b) => +new Date(a.publishedAt) - +new Date(b.publishedAt));
443 | // liveChat.messages = liveChat.messages.concat(newMessages);
444 | // if (newAuthors.length > 0) {
445 | // io.emit(`authors/${liveChatId}`, newAuthors);
446 | // }
447 | // io.emit(`messages/${liveChatId}`, newMessages);
448 | // }
449 | // await updateDB(liveChat);
450 | // }
451 | // } else {
452 | // console.error(JSON.stringify(result, null, 2));
453 | // }
454 |
455 | // nextPageToken = result.nextPageToken;
456 |
457 | // await new Promise((resolve) => {
458 | // setTimeout(resolve, result.pollingIntervalMillis);
459 | // });
460 | // } while (nextPageToken);
461 | }
462 |
463 | router.get('/messages', async (req, res, next) => {
464 | const {
465 | id,
466 | } = req.query;
467 | if (!id) return next(new Error('Invalid chat id.'));
468 | let liveChat = await events.findOne({
469 | id,
470 | });
471 | if (!liveChat) {
472 | liveChat = await events.insert({
473 | id,
474 | messages: [],
475 | messagesById: {},
476 | authorsById: {},
477 | team: {},
478 | });
479 | }
480 | if (!listening[id]) {
481 | getLatestMessages(socket.io, id);
482 | }
483 | return res.json(liveChat.messages);
484 | });
485 |
486 | router.get('/authors', async (req, res, next) => {
487 | const {
488 | id,
489 | } = req.query;
490 | if (!id) return next(new Error('Invalid chat id.'));
491 | let liveChat = await events.findOne({
492 | id,
493 | });
494 | if (!liveChat) {
495 | liveChat = await events.insert({
496 | id,
497 | messages: [],
498 | messagesById: {},
499 | authorsById: {},
500 | team: {},
501 | });
502 | }
503 | if (!listening[id]) {
504 | getLatestMessages(socket.io, id);
505 | }
506 | return res.json(liveChat.authorsById);
507 | });
508 |
509 | async function getEvents(eventType) {
510 | const params = new URLSearchParams({
511 | part: 'snippet',
512 | channelId: process.env.YOUTUBE_CHANNEL_ID,
513 | key: process.env.GOOGLE_API_KEY,
514 | type: 'video',
515 | eventType,
516 | });
517 |
518 | const url = `https://www.googleapis.com/youtube/v3/search?${params}`;
519 | const response = await fetch(url);
520 | const json = await response.json();
521 | console.log(json);
522 | return json;
523 | }
524 |
525 | router.get('/streams', async (req, res) => {
526 | const [liveEvents, upcomingEvents] = await Promise.all([
527 | getEvents('live'),
528 | getEvents('upcoming'),
529 | ]);
530 |
531 | const events = [].concat(liveEvents.items || [], upcomingEvents.items || []);
532 |
533 | if (events.length) {
534 | const liveStreams = await Promise.all(
535 | events.map(async (video) => {
536 | const videoParams = new URLSearchParams({
537 | part: 'liveStreamingDetails',
538 | id: video.id.videoId,
539 | key: process.env.GOOGLE_API_KEY,
540 | });
541 | const videoUrl = `https://www.googleapis.com/youtube/v3/videos?${videoParams}`;
542 | const videoResponse = await fetch(videoUrl);
543 | const data = await videoResponse.json();
544 | // eslint-disable-next-line
545 | video.snippet.liveChatId = data.items[0].liveStreamingDetails.activeLiveChatId;
546 | return {
547 | ...video,
548 | ...video.id,
549 | ...data.items[0],
550 | };
551 | }),
552 | );
553 | res.json(liveStreams);
554 | } else {
555 | res.json([]);
556 | }
557 | });
558 |
559 | module.exports = {
560 | getLatestMessages,
561 | router,
562 | };
563 |
--------------------------------------------------------------------------------
/server/src/socket.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | io: null,
3 | setIO(io) {
4 | this.io = io;
5 | }
6 | };
7 |
--------------------------------------------------------------------------------