├── .gitignore
├── LICENSE
├── README.md
├── index.js
├── package-lock.json
├── package.json
└── src
├── Core
└── Core.js
└── Github
└── Github.js
/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 |
8 | # Runtime data
9 | pids
10 | *.pid
11 | *.seed
12 | *.pid.lock
13 |
14 | # Directory for instrumented libs generated by jscoverage/JSCover
15 | lib-cov
16 |
17 | # Coverage directory used by tools like istanbul
18 | coverage
19 |
20 | # nyc test coverage
21 | .nyc_output
22 |
23 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
24 | .grunt
25 |
26 | # Bower dependency directory (https://bower.io/)
27 | bower_components
28 |
29 | # node-waf configuration
30 | .lock-wscript
31 |
32 | # Compiled binary addons (https://nodejs.org/api/addons.html)
33 | build/Release
34 |
35 | # Dependency directories
36 | node_modules/
37 | jspm_packages/
38 |
39 | # TypeScript v1 declaration files
40 | typings/
41 |
42 | # Optional npm cache directory
43 | .npm
44 |
45 | # Optional eslint cache
46 | .eslintcache
47 |
48 | # Optional REPL history
49 | .node_repl_history
50 |
51 | # Output of 'npm pack'
52 | *.tgz
53 |
54 | # Yarn Integrity file
55 | .yarn-integrity
56 |
57 | # dotenv environment variables file
58 | .env
59 |
60 | # next.js build output
61 | .next
62 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2019 Michele Gruppioni
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Slack Webhooks Github Crawler
2 | This script search for Slack Webhooks token publicly exposed on Github.com
3 |
4 | Slack webhooks are easy to search on Github since they have all the same format:
5 | `https://hooks.slack.com/services/TXXXXXXXX/BXXXXXXXX/xxxxxxxxxxxxxxxxxxxxxxxx`
6 |
7 | ---
8 |
9 | ## The Social Experiment
10 | I've run this script on a cloud function every hour for 6 months and in total I've collected more than **6500 Slack Webhooks**.
11 | Afterward I've sent a message to all the #general channels warning that they have an exposed token on Github.
12 | The message received by the people was the following:
13 |
14 |
15 |
16 | ### Results
17 | In total I've sent ~6500 Slack messages and the youtube video that was explaining the experiment had ~3700 views, so we can assume that **roughly 57% of webhooks was still valid.**
18 | \* *Supposing that only one person had watched this video per channel*
19 |
20 | ### Video Message
21 | Click on the image for play the video:
22 |
23 |
26 |
27 | ### Comments
28 | Most of the people appreciated that I've sent a message to them and warned them about their security problems.
29 | You can read all the comments under the youtube video that I've sent to them:
30 | https://www.youtube.com/watch?v=ybFTGeJICho&t=2s
31 |
32 | ---
33 |
34 | ## Technical Info
35 |
36 | The script instruments a chromium instance using [puppeteer](https://developers.google.com/web/tools/puppeteer/) and use it to search github the prefix of the slack token.
37 | Since the big number of results the script filter for a specific programming language and for a specific sorting option every time it run.
38 |
39 | ---
40 |
41 | ## Installation Instructions
42 | 1) install [nodejs](https://nodejs.org/en/)
43 | 2) Open your terminal and cd in the repo folder
44 | 3) Type `npm install`
45 | 4) Edit `index.js` and insert your Github username and password (needed for perform the search)
46 | 5) Type `node index.js`
47 |
48 | Done! 🎉
49 |
50 | ### If you like this project please:
51 |
52 |
53 |
54 | Gruppio 2019
55 |
--------------------------------------------------------------------------------
/index.js:
--------------------------------------------------------------------------------
1 | const _ = require('lodash')
2 | const Core = require("./src/Core/Core")
3 |
4 | const modes = [0, 1, 2]
5 | const languages = ["JSON", "XML", "Shell", "Python", "Java", "JavaScript", "Ruby", "Swift", "PHP", "Markdown", "YAML", "DotNet", "C", "Text", "HTML", "C++"]
6 |
7 | const githubUsername = "YOUR GITHUB USERNAME"
8 | const githubPassword = "YOUR GITHUB PASSWORD"
9 |
10 | const language = _.sample(languages)
11 | const mode = _.sample(modes)
12 |
13 | const core = new Core(githubUsername, githubPassword)
14 |
15 | console.log("Start Search " + language + ", mode:" + mode +"...")
16 | core.searchSlackWebhooks(language, mode).then ((numWebhooksFound) => {
17 | console.log("Done. Found " + numWebhooksFound + " slack webhooks, for: " + language + " and mode:" + mode);
18 | })
19 |
20 |
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "index",
3 | "requires": true,
4 | "lockfileVersion": 1,
5 | "dependencies": {
6 | "@babel/code-frame": {
7 | "version": "7.0.0",
8 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz",
9 | "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==",
10 | "dev": true,
11 | "requires": {
12 | "@babel/highlight": "^7.0.0"
13 | }
14 | },
15 | "@babel/highlight": {
16 | "version": "7.5.0",
17 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz",
18 | "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==",
19 | "dev": true,
20 | "requires": {
21 | "chalk": "^2.0.0",
22 | "esutils": "^2.0.2",
23 | "js-tokens": "^4.0.0"
24 | }
25 | },
26 | "acorn": {
27 | "version": "6.2.0",
28 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.2.0.tgz",
29 | "integrity": "sha512-8oe72N3WPMjA+2zVG71Ia0nXZ8DpQH+QyyHO+p06jT8eg8FGG3FbcUIi8KziHlAfheJQZeoqbvq1mQSQHXKYLw==",
30 | "dev": true
31 | },
32 | "acorn-jsx": {
33 | "version": "5.0.1",
34 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.1.tgz",
35 | "integrity": "sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg==",
36 | "dev": true
37 | },
38 | "agent-base": {
39 | "version": "4.3.0",
40 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz",
41 | "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==",
42 | "requires": {
43 | "es6-promisify": "^5.0.0"
44 | }
45 | },
46 | "ajv": {
47 | "version": "6.10.1",
48 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.1.tgz",
49 | "integrity": "sha512-w1YQaVGNC6t2UCPjEawK/vo/dG8OOrVtUmhBT1uJJYxbl5kU2Tj3v6LGqBcsysN1yhuCStJCCA3GqdvKY8sqXQ==",
50 | "dev": true,
51 | "requires": {
52 | "fast-deep-equal": "^2.0.1",
53 | "fast-json-stable-stringify": "^2.0.0",
54 | "json-schema-traverse": "^0.4.1",
55 | "uri-js": "^4.2.2"
56 | }
57 | },
58 | "ansi-escapes": {
59 | "version": "3.2.0",
60 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz",
61 | "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==",
62 | "dev": true
63 | },
64 | "ansi-regex": {
65 | "version": "3.0.0",
66 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
67 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
68 | "dev": true
69 | },
70 | "ansi-styles": {
71 | "version": "3.2.1",
72 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
73 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
74 | "dev": true,
75 | "requires": {
76 | "color-convert": "^1.9.0"
77 | }
78 | },
79 | "argparse": {
80 | "version": "1.0.10",
81 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
82 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
83 | "dev": true,
84 | "requires": {
85 | "sprintf-js": "~1.0.2"
86 | }
87 | },
88 | "astral-regex": {
89 | "version": "1.0.0",
90 | "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz",
91 | "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==",
92 | "dev": true
93 | },
94 | "async-limiter": {
95 | "version": "1.0.0",
96 | "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz",
97 | "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg=="
98 | },
99 | "balanced-match": {
100 | "version": "1.0.0",
101 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
102 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
103 | },
104 | "brace-expansion": {
105 | "version": "1.1.11",
106 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
107 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
108 | "requires": {
109 | "balanced-match": "^1.0.0",
110 | "concat-map": "0.0.1"
111 | }
112 | },
113 | "buffer-from": {
114 | "version": "1.1.1",
115 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
116 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A=="
117 | },
118 | "callsites": {
119 | "version": "3.1.0",
120 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
121 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
122 | "dev": true
123 | },
124 | "chalk": {
125 | "version": "2.4.2",
126 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
127 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
128 | "dev": true,
129 | "requires": {
130 | "ansi-styles": "^3.2.1",
131 | "escape-string-regexp": "^1.0.5",
132 | "supports-color": "^5.3.0"
133 | }
134 | },
135 | "chardet": {
136 | "version": "0.7.0",
137 | "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
138 | "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==",
139 | "dev": true
140 | },
141 | "cli-cursor": {
142 | "version": "2.1.0",
143 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
144 | "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
145 | "dev": true,
146 | "requires": {
147 | "restore-cursor": "^2.0.0"
148 | }
149 | },
150 | "cli-width": {
151 | "version": "2.2.0",
152 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz",
153 | "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=",
154 | "dev": true
155 | },
156 | "color-convert": {
157 | "version": "1.9.3",
158 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
159 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
160 | "dev": true,
161 | "requires": {
162 | "color-name": "1.1.3"
163 | }
164 | },
165 | "color-name": {
166 | "version": "1.1.3",
167 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
168 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
169 | "dev": true
170 | },
171 | "concat-map": {
172 | "version": "0.0.1",
173 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
174 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
175 | },
176 | "concat-stream": {
177 | "version": "1.6.2",
178 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
179 | "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
180 | "requires": {
181 | "buffer-from": "^1.0.0",
182 | "inherits": "^2.0.3",
183 | "readable-stream": "^2.2.2",
184 | "typedarray": "^0.0.6"
185 | }
186 | },
187 | "core-util-is": {
188 | "version": "1.0.2",
189 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
190 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
191 | },
192 | "cross-spawn": {
193 | "version": "6.0.5",
194 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
195 | "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
196 | "dev": true,
197 | "requires": {
198 | "nice-try": "^1.0.4",
199 | "path-key": "^2.0.1",
200 | "semver": "^5.5.0",
201 | "shebang-command": "^1.2.0",
202 | "which": "^1.2.9"
203 | }
204 | },
205 | "debug": {
206 | "version": "4.1.1",
207 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
208 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
209 | "requires": {
210 | "ms": "^2.1.1"
211 | }
212 | },
213 | "deep-is": {
214 | "version": "0.1.3",
215 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
216 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
217 | "dev": true
218 | },
219 | "delay": {
220 | "version": "4.3.0",
221 | "resolved": "https://registry.npmjs.org/delay/-/delay-4.3.0.tgz",
222 | "integrity": "sha512-Lwaf3zVFDMBop1yDuFZ19F9WyGcZcGacsbdlZtWjQmM50tOcMntm1njF/Nb/Vjij3KaSvCF+sEYGKrrjObu2NA=="
223 | },
224 | "doctrine": {
225 | "version": "3.0.0",
226 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
227 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
228 | "dev": true,
229 | "requires": {
230 | "esutils": "^2.0.2"
231 | }
232 | },
233 | "emoji-regex": {
234 | "version": "7.0.3",
235 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
236 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
237 | "dev": true
238 | },
239 | "es6-promise": {
240 | "version": "4.2.8",
241 | "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz",
242 | "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w=="
243 | },
244 | "es6-promisify": {
245 | "version": "5.0.0",
246 | "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz",
247 | "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=",
248 | "requires": {
249 | "es6-promise": "^4.0.3"
250 | }
251 | },
252 | "escape-string-regexp": {
253 | "version": "1.0.5",
254 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
255 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
256 | "dev": true
257 | },
258 | "eslint": {
259 | "version": "5.16.0",
260 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz",
261 | "integrity": "sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==",
262 | "dev": true,
263 | "requires": {
264 | "@babel/code-frame": "^7.0.0",
265 | "ajv": "^6.9.1",
266 | "chalk": "^2.1.0",
267 | "cross-spawn": "^6.0.5",
268 | "debug": "^4.0.1",
269 | "doctrine": "^3.0.0",
270 | "eslint-scope": "^4.0.3",
271 | "eslint-utils": "^1.3.1",
272 | "eslint-visitor-keys": "^1.0.0",
273 | "espree": "^5.0.1",
274 | "esquery": "^1.0.1",
275 | "esutils": "^2.0.2",
276 | "file-entry-cache": "^5.0.1",
277 | "functional-red-black-tree": "^1.0.1",
278 | "glob": "^7.1.2",
279 | "globals": "^11.7.0",
280 | "ignore": "^4.0.6",
281 | "import-fresh": "^3.0.0",
282 | "imurmurhash": "^0.1.4",
283 | "inquirer": "^6.2.2",
284 | "js-yaml": "^3.13.0",
285 | "json-stable-stringify-without-jsonify": "^1.0.1",
286 | "levn": "^0.3.0",
287 | "lodash": "^4.17.11",
288 | "minimatch": "^3.0.4",
289 | "mkdirp": "^0.5.1",
290 | "natural-compare": "^1.4.0",
291 | "optionator": "^0.8.2",
292 | "path-is-inside": "^1.0.2",
293 | "progress": "^2.0.0",
294 | "regexpp": "^2.0.1",
295 | "semver": "^5.5.1",
296 | "strip-ansi": "^4.0.0",
297 | "strip-json-comments": "^2.0.1",
298 | "table": "^5.2.3",
299 | "text-table": "^0.2.0"
300 | }
301 | },
302 | "eslint-plugin-promise": {
303 | "version": "4.2.1",
304 | "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.2.1.tgz",
305 | "integrity": "sha512-VoM09vT7bfA7D+upt+FjeBO5eHIJQBUWki1aPvB+vbNiHS3+oGIJGIeyBtKQTME6UPXXy3vV07OL1tHd3ANuDw==",
306 | "dev": true
307 | },
308 | "eslint-scope": {
309 | "version": "4.0.3",
310 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz",
311 | "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==",
312 | "dev": true,
313 | "requires": {
314 | "esrecurse": "^4.1.0",
315 | "estraverse": "^4.1.1"
316 | }
317 | },
318 | "eslint-utils": {
319 | "version": "1.3.1",
320 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.3.1.tgz",
321 | "integrity": "sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q==",
322 | "dev": true
323 | },
324 | "eslint-visitor-keys": {
325 | "version": "1.0.0",
326 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz",
327 | "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==",
328 | "dev": true
329 | },
330 | "espree": {
331 | "version": "5.0.1",
332 | "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz",
333 | "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==",
334 | "dev": true,
335 | "requires": {
336 | "acorn": "^6.0.7",
337 | "acorn-jsx": "^5.0.0",
338 | "eslint-visitor-keys": "^1.0.0"
339 | }
340 | },
341 | "esprima": {
342 | "version": "4.0.1",
343 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
344 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
345 | "dev": true
346 | },
347 | "esquery": {
348 | "version": "1.0.1",
349 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz",
350 | "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==",
351 | "dev": true,
352 | "requires": {
353 | "estraverse": "^4.0.0"
354 | }
355 | },
356 | "esrecurse": {
357 | "version": "4.2.1",
358 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
359 | "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
360 | "dev": true,
361 | "requires": {
362 | "estraverse": "^4.1.0"
363 | }
364 | },
365 | "estraverse": {
366 | "version": "4.2.0",
367 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
368 | "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
369 | "dev": true
370 | },
371 | "esutils": {
372 | "version": "2.0.2",
373 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
374 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
375 | "dev": true
376 | },
377 | "external-editor": {
378 | "version": "3.0.3",
379 | "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz",
380 | "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==",
381 | "dev": true,
382 | "requires": {
383 | "chardet": "^0.7.0",
384 | "iconv-lite": "^0.4.24",
385 | "tmp": "^0.0.33"
386 | }
387 | },
388 | "extract-zip": {
389 | "version": "1.6.7",
390 | "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz",
391 | "integrity": "sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k=",
392 | "requires": {
393 | "concat-stream": "1.6.2",
394 | "debug": "2.6.9",
395 | "mkdirp": "0.5.1",
396 | "yauzl": "2.4.1"
397 | },
398 | "dependencies": {
399 | "debug": {
400 | "version": "2.6.9",
401 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
402 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
403 | "requires": {
404 | "ms": "2.0.0"
405 | }
406 | },
407 | "ms": {
408 | "version": "2.0.0",
409 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
410 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
411 | }
412 | }
413 | },
414 | "fast-deep-equal": {
415 | "version": "2.0.1",
416 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
417 | "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=",
418 | "dev": true
419 | },
420 | "fast-json-stable-stringify": {
421 | "version": "2.0.0",
422 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
423 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
424 | "dev": true
425 | },
426 | "fast-levenshtein": {
427 | "version": "2.0.6",
428 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
429 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
430 | "dev": true
431 | },
432 | "fd-slicer": {
433 | "version": "1.0.1",
434 | "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz",
435 | "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=",
436 | "requires": {
437 | "pend": "~1.2.0"
438 | }
439 | },
440 | "figures": {
441 | "version": "2.0.0",
442 | "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
443 | "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
444 | "dev": true,
445 | "requires": {
446 | "escape-string-regexp": "^1.0.5"
447 | }
448 | },
449 | "file-entry-cache": {
450 | "version": "5.0.1",
451 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz",
452 | "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==",
453 | "dev": true,
454 | "requires": {
455 | "flat-cache": "^2.0.1"
456 | }
457 | },
458 | "flat-cache": {
459 | "version": "2.0.1",
460 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz",
461 | "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==",
462 | "dev": true,
463 | "requires": {
464 | "flatted": "^2.0.0",
465 | "rimraf": "2.6.3",
466 | "write": "1.0.3"
467 | }
468 | },
469 | "flatted": {
470 | "version": "2.0.1",
471 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz",
472 | "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==",
473 | "dev": true
474 | },
475 | "fs.realpath": {
476 | "version": "1.0.0",
477 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
478 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
479 | },
480 | "functional-red-black-tree": {
481 | "version": "1.0.1",
482 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
483 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
484 | "dev": true
485 | },
486 | "glob": {
487 | "version": "7.1.4",
488 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz",
489 | "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==",
490 | "requires": {
491 | "fs.realpath": "^1.0.0",
492 | "inflight": "^1.0.4",
493 | "inherits": "2",
494 | "minimatch": "^3.0.4",
495 | "once": "^1.3.0",
496 | "path-is-absolute": "^1.0.0"
497 | }
498 | },
499 | "globals": {
500 | "version": "11.12.0",
501 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
502 | "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
503 | "dev": true
504 | },
505 | "has-flag": {
506 | "version": "3.0.0",
507 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
508 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
509 | "dev": true
510 | },
511 | "https-proxy-agent": {
512 | "version": "2.2.2",
513 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.2.tgz",
514 | "integrity": "sha512-c8Ndjc9Bkpfx/vCJueCPy0jlP4ccCCSNDp8xwCZzPjKJUm+B+u9WX2x98Qx4n1PiMNTWo3D7KK5ifNV/yJyRzg==",
515 | "requires": {
516 | "agent-base": "^4.3.0",
517 | "debug": "^3.1.0"
518 | },
519 | "dependencies": {
520 | "debug": {
521 | "version": "3.2.6",
522 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
523 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
524 | "requires": {
525 | "ms": "^2.1.1"
526 | }
527 | }
528 | }
529 | },
530 | "iconv-lite": {
531 | "version": "0.4.24",
532 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
533 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
534 | "dev": true,
535 | "requires": {
536 | "safer-buffer": ">= 2.1.2 < 3"
537 | }
538 | },
539 | "ignore": {
540 | "version": "4.0.6",
541 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
542 | "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
543 | "dev": true
544 | },
545 | "import-fresh": {
546 | "version": "3.1.0",
547 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.1.0.tgz",
548 | "integrity": "sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ==",
549 | "dev": true,
550 | "requires": {
551 | "parent-module": "^1.0.0",
552 | "resolve-from": "^4.0.0"
553 | }
554 | },
555 | "imurmurhash": {
556 | "version": "0.1.4",
557 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
558 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
559 | "dev": true
560 | },
561 | "inflight": {
562 | "version": "1.0.6",
563 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
564 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
565 | "requires": {
566 | "once": "^1.3.0",
567 | "wrappy": "1"
568 | }
569 | },
570 | "inherits": {
571 | "version": "2.0.4",
572 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
573 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
574 | },
575 | "inquirer": {
576 | "version": "6.4.1",
577 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.4.1.tgz",
578 | "integrity": "sha512-/Jw+qPZx4EDYsaT6uz7F4GJRNFMRdKNeUZw3ZnKV8lyuUgz/YWRCSUAJMZSVhSq4Ec0R2oYnyi6b3d4JXcL5Nw==",
579 | "dev": true,
580 | "requires": {
581 | "ansi-escapes": "^3.2.0",
582 | "chalk": "^2.4.2",
583 | "cli-cursor": "^2.1.0",
584 | "cli-width": "^2.0.0",
585 | "external-editor": "^3.0.3",
586 | "figures": "^2.0.0",
587 | "lodash": "^4.17.11",
588 | "mute-stream": "0.0.7",
589 | "run-async": "^2.2.0",
590 | "rxjs": "^6.4.0",
591 | "string-width": "^2.1.0",
592 | "strip-ansi": "^5.1.0",
593 | "through": "^2.3.6"
594 | },
595 | "dependencies": {
596 | "ansi-regex": {
597 | "version": "4.1.0",
598 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
599 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
600 | "dev": true
601 | },
602 | "strip-ansi": {
603 | "version": "5.2.0",
604 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
605 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
606 | "dev": true,
607 | "requires": {
608 | "ansi-regex": "^4.1.0"
609 | }
610 | }
611 | }
612 | },
613 | "is-fullwidth-code-point": {
614 | "version": "2.0.0",
615 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
616 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
617 | "dev": true
618 | },
619 | "is-promise": {
620 | "version": "2.1.0",
621 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
622 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=",
623 | "dev": true
624 | },
625 | "isarray": {
626 | "version": "1.0.0",
627 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
628 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
629 | },
630 | "isexe": {
631 | "version": "2.0.0",
632 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
633 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
634 | "dev": true
635 | },
636 | "js-tokens": {
637 | "version": "4.0.0",
638 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
639 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
640 | "dev": true
641 | },
642 | "js-yaml": {
643 | "version": "3.13.1",
644 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
645 | "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
646 | "dev": true,
647 | "requires": {
648 | "argparse": "^1.0.7",
649 | "esprima": "^4.0.0"
650 | }
651 | },
652 | "json-schema-traverse": {
653 | "version": "0.4.1",
654 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
655 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
656 | "dev": true
657 | },
658 | "json-stable-stringify-without-jsonify": {
659 | "version": "1.0.1",
660 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
661 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
662 | "dev": true
663 | },
664 | "levn": {
665 | "version": "0.3.0",
666 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
667 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
668 | "dev": true,
669 | "requires": {
670 | "prelude-ls": "~1.1.2",
671 | "type-check": "~0.3.2"
672 | }
673 | },
674 | "lodash": {
675 | "version": "4.17.11",
676 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
677 | "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg=="
678 | },
679 | "mime": {
680 | "version": "2.4.4",
681 | "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz",
682 | "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA=="
683 | },
684 | "mimic-fn": {
685 | "version": "1.2.0",
686 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
687 | "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
688 | "dev": true
689 | },
690 | "minimatch": {
691 | "version": "3.0.4",
692 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
693 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
694 | "requires": {
695 | "brace-expansion": "^1.1.7"
696 | }
697 | },
698 | "minimist": {
699 | "version": "0.0.8",
700 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
701 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
702 | },
703 | "mkdirp": {
704 | "version": "0.5.1",
705 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
706 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
707 | "requires": {
708 | "minimist": "0.0.8"
709 | }
710 | },
711 | "ms": {
712 | "version": "2.1.2",
713 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
714 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
715 | },
716 | "mute-stream": {
717 | "version": "0.0.7",
718 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
719 | "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=",
720 | "dev": true
721 | },
722 | "natural-compare": {
723 | "version": "1.4.0",
724 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
725 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
726 | "dev": true
727 | },
728 | "nice-try": {
729 | "version": "1.0.5",
730 | "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
731 | "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
732 | "dev": true
733 | },
734 | "once": {
735 | "version": "1.4.0",
736 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
737 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
738 | "requires": {
739 | "wrappy": "1"
740 | }
741 | },
742 | "onetime": {
743 | "version": "2.0.1",
744 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
745 | "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
746 | "dev": true,
747 | "requires": {
748 | "mimic-fn": "^1.0.0"
749 | }
750 | },
751 | "optionator": {
752 | "version": "0.8.2",
753 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
754 | "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
755 | "dev": true,
756 | "requires": {
757 | "deep-is": "~0.1.3",
758 | "fast-levenshtein": "~2.0.4",
759 | "levn": "~0.3.0",
760 | "prelude-ls": "~1.1.2",
761 | "type-check": "~0.3.2",
762 | "wordwrap": "~1.0.0"
763 | }
764 | },
765 | "os-tmpdir": {
766 | "version": "1.0.2",
767 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
768 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
769 | "dev": true
770 | },
771 | "parent-module": {
772 | "version": "1.0.1",
773 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
774 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
775 | "dev": true,
776 | "requires": {
777 | "callsites": "^3.0.0"
778 | }
779 | },
780 | "path-is-absolute": {
781 | "version": "1.0.1",
782 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
783 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
784 | },
785 | "path-is-inside": {
786 | "version": "1.0.2",
787 | "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
788 | "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
789 | "dev": true
790 | },
791 | "path-key": {
792 | "version": "2.0.1",
793 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
794 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
795 | "dev": true
796 | },
797 | "pend": {
798 | "version": "1.2.0",
799 | "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
800 | "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA="
801 | },
802 | "prelude-ls": {
803 | "version": "1.1.2",
804 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
805 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
806 | "dev": true
807 | },
808 | "process-nextick-args": {
809 | "version": "2.0.1",
810 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
811 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
812 | },
813 | "progress": {
814 | "version": "2.0.3",
815 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
816 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA=="
817 | },
818 | "proxy-from-env": {
819 | "version": "1.0.0",
820 | "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz",
821 | "integrity": "sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4="
822 | },
823 | "punycode": {
824 | "version": "2.1.1",
825 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
826 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
827 | "dev": true
828 | },
829 | "puppeteer": {
830 | "version": "1.18.1",
831 | "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-1.18.1.tgz",
832 | "integrity": "sha512-luUy0HPSuWPsPZ1wAp6NinE0zgetWtudf5zwZ6dHjMWfYpTQcmKveFRox7VBNhQ98OjNA9PQ9PzQyX8k/KrxTg==",
833 | "requires": {
834 | "debug": "^4.1.0",
835 | "extract-zip": "^1.6.6",
836 | "https-proxy-agent": "^2.2.1",
837 | "mime": "^2.0.3",
838 | "progress": "^2.0.1",
839 | "proxy-from-env": "^1.0.0",
840 | "rimraf": "^2.6.1",
841 | "ws": "^6.1.0"
842 | }
843 | },
844 | "readable-stream": {
845 | "version": "2.3.6",
846 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
847 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
848 | "requires": {
849 | "core-util-is": "~1.0.0",
850 | "inherits": "~2.0.3",
851 | "isarray": "~1.0.0",
852 | "process-nextick-args": "~2.0.0",
853 | "safe-buffer": "~5.1.1",
854 | "string_decoder": "~1.1.1",
855 | "util-deprecate": "~1.0.1"
856 | }
857 | },
858 | "regexpp": {
859 | "version": "2.0.1",
860 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz",
861 | "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==",
862 | "dev": true
863 | },
864 | "resolve-from": {
865 | "version": "4.0.0",
866 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
867 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
868 | "dev": true
869 | },
870 | "restore-cursor": {
871 | "version": "2.0.0",
872 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
873 | "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
874 | "dev": true,
875 | "requires": {
876 | "onetime": "^2.0.0",
877 | "signal-exit": "^3.0.2"
878 | }
879 | },
880 | "rimraf": {
881 | "version": "2.6.3",
882 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
883 | "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
884 | "requires": {
885 | "glob": "^7.1.3"
886 | }
887 | },
888 | "run-async": {
889 | "version": "2.3.0",
890 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz",
891 | "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=",
892 | "dev": true,
893 | "requires": {
894 | "is-promise": "^2.1.0"
895 | }
896 | },
897 | "rxjs": {
898 | "version": "6.5.2",
899 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.2.tgz",
900 | "integrity": "sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg==",
901 | "dev": true,
902 | "requires": {
903 | "tslib": "^1.9.0"
904 | }
905 | },
906 | "safe-buffer": {
907 | "version": "5.1.2",
908 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
909 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
910 | },
911 | "safer-buffer": {
912 | "version": "2.1.2",
913 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
914 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
915 | "dev": true
916 | },
917 | "semver": {
918 | "version": "5.7.0",
919 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
920 | "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==",
921 | "dev": true
922 | },
923 | "shebang-command": {
924 | "version": "1.2.0",
925 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
926 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
927 | "dev": true,
928 | "requires": {
929 | "shebang-regex": "^1.0.0"
930 | }
931 | },
932 | "shebang-regex": {
933 | "version": "1.0.0",
934 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
935 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
936 | "dev": true
937 | },
938 | "signal-exit": {
939 | "version": "3.0.2",
940 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
941 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
942 | "dev": true
943 | },
944 | "slice-ansi": {
945 | "version": "2.1.0",
946 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz",
947 | "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==",
948 | "dev": true,
949 | "requires": {
950 | "ansi-styles": "^3.2.0",
951 | "astral-regex": "^1.0.0",
952 | "is-fullwidth-code-point": "^2.0.0"
953 | }
954 | },
955 | "sprintf-js": {
956 | "version": "1.0.3",
957 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
958 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
959 | "dev": true
960 | },
961 | "string-width": {
962 | "version": "2.1.1",
963 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
964 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
965 | "dev": true,
966 | "requires": {
967 | "is-fullwidth-code-point": "^2.0.0",
968 | "strip-ansi": "^4.0.0"
969 | }
970 | },
971 | "string_decoder": {
972 | "version": "1.1.1",
973 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
974 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
975 | "requires": {
976 | "safe-buffer": "~5.1.0"
977 | }
978 | },
979 | "strip-ansi": {
980 | "version": "4.0.0",
981 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
982 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
983 | "dev": true,
984 | "requires": {
985 | "ansi-regex": "^3.0.0"
986 | }
987 | },
988 | "strip-json-comments": {
989 | "version": "2.0.1",
990 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
991 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
992 | "dev": true
993 | },
994 | "supports-color": {
995 | "version": "5.5.0",
996 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
997 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
998 | "dev": true,
999 | "requires": {
1000 | "has-flag": "^3.0.0"
1001 | }
1002 | },
1003 | "table": {
1004 | "version": "5.4.1",
1005 | "resolved": "https://registry.npmjs.org/table/-/table-5.4.1.tgz",
1006 | "integrity": "sha512-E6CK1/pZe2N75rGZQotFOdmzWQ1AILtgYbMAbAjvms0S1l5IDB47zG3nCnFGB/w+7nB3vKofbLXCH7HPBo864w==",
1007 | "dev": true,
1008 | "requires": {
1009 | "ajv": "^6.9.1",
1010 | "lodash": "^4.17.11",
1011 | "slice-ansi": "^2.1.0",
1012 | "string-width": "^3.0.0"
1013 | },
1014 | "dependencies": {
1015 | "ansi-regex": {
1016 | "version": "4.1.0",
1017 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
1018 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
1019 | "dev": true
1020 | },
1021 | "string-width": {
1022 | "version": "3.1.0",
1023 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
1024 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
1025 | "dev": true,
1026 | "requires": {
1027 | "emoji-regex": "^7.0.1",
1028 | "is-fullwidth-code-point": "^2.0.0",
1029 | "strip-ansi": "^5.1.0"
1030 | }
1031 | },
1032 | "strip-ansi": {
1033 | "version": "5.2.0",
1034 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
1035 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
1036 | "dev": true,
1037 | "requires": {
1038 | "ansi-regex": "^4.1.0"
1039 | }
1040 | }
1041 | }
1042 | },
1043 | "text-table": {
1044 | "version": "0.2.0",
1045 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
1046 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
1047 | "dev": true
1048 | },
1049 | "through": {
1050 | "version": "2.3.8",
1051 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
1052 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
1053 | "dev": true
1054 | },
1055 | "tmp": {
1056 | "version": "0.0.33",
1057 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
1058 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
1059 | "dev": true,
1060 | "requires": {
1061 | "os-tmpdir": "~1.0.2"
1062 | }
1063 | },
1064 | "tslib": {
1065 | "version": "1.10.0",
1066 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz",
1067 | "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==",
1068 | "dev": true
1069 | },
1070 | "type-check": {
1071 | "version": "0.3.2",
1072 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
1073 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
1074 | "dev": true,
1075 | "requires": {
1076 | "prelude-ls": "~1.1.2"
1077 | }
1078 | },
1079 | "typedarray": {
1080 | "version": "0.0.6",
1081 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
1082 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c="
1083 | },
1084 | "uri-js": {
1085 | "version": "4.2.2",
1086 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
1087 | "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
1088 | "dev": true,
1089 | "requires": {
1090 | "punycode": "^2.1.0"
1091 | }
1092 | },
1093 | "util-deprecate": {
1094 | "version": "1.0.2",
1095 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
1096 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
1097 | },
1098 | "which": {
1099 | "version": "1.3.1",
1100 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
1101 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
1102 | "dev": true,
1103 | "requires": {
1104 | "isexe": "^2.0.0"
1105 | }
1106 | },
1107 | "wordwrap": {
1108 | "version": "1.0.0",
1109 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
1110 | "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
1111 | "dev": true
1112 | },
1113 | "wrappy": {
1114 | "version": "1.0.2",
1115 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
1116 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
1117 | },
1118 | "write": {
1119 | "version": "1.0.3",
1120 | "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz",
1121 | "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==",
1122 | "dev": true,
1123 | "requires": {
1124 | "mkdirp": "^0.5.1"
1125 | }
1126 | },
1127 | "ws": {
1128 | "version": "6.2.1",
1129 | "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz",
1130 | "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==",
1131 | "requires": {
1132 | "async-limiter": "~1.0.0"
1133 | }
1134 | },
1135 | "yauzl": {
1136 | "version": "2.4.1",
1137 | "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz",
1138 | "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=",
1139 | "requires": {
1140 | "fd-slicer": "~1.0.1"
1141 | }
1142 | }
1143 | }
1144 | }
1145 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "index",
3 | "description": "",
4 | "engines": {
5 | "node": "8"
6 | },
7 | "scripts": {},
8 | "dependencies": {
9 | "delay": "^4.1.0",
10 | "lodash": "^4.17.11",
11 | "puppeteer": "^1.12.2"
12 | },
13 | "devDependencies": {
14 | "eslint": "^5.12.0",
15 | "eslint-plugin-promise": "^4.0.1"
16 | },
17 | "private": true
18 | }
19 |
--------------------------------------------------------------------------------
/src/Core/Core.js:
--------------------------------------------------------------------------------
1 | const Github = require('../Github/Github')
2 | const delay = require('delay')
3 |
4 | class Core {
5 | constructor(githubUsername, githubPassword) {
6 | this.github = new Github(githubUsername, githubPassword)
7 | }
8 |
9 | async searchSlackWebhooks(language, mode) {
10 | await this.github.login()
11 | var numUrls = 0
12 | for(var page = 1; page <= 100; page++) {
13 | numUrls += await this.searchForLanguageAndPageWithMode(language, page, mode)
14 | await delay(500)
15 | }
16 | return numUrls
17 | }
18 |
19 | async searchForLanguageAndPageWithMode(language, page, mode) {
20 | var code = null
21 | if (mode === 1) {
22 | code = await this.github.searchCode('"hooks.slack.com"', page, language, true, "asc")
23 | }
24 | else if (mode === 2) {
25 | code = await this.github.searchCode('"hooks.slack.com"', page, language, true, "desc")
26 | } else {
27 | code = await this.github.searchCode('"hooks.slack.com"', page, language)
28 | }
29 | const numUrlFound = await this.extractSlackWebhooksFromCode(code)
30 | console.log(numUrlFound + " Urls Found, Search(mode: " + mode + "): " + language + ", page: " + page)
31 | return numUrlFound
32 | }
33 |
34 | async extractSlackWebhooksFromCode(code) {
35 | var regex = /services\/T\w{8}\/B\w{8}\/\w{24}/g;
36 | const urls = code.match(regex)
37 | if (urls) {
38 | const uniqueUrls = urls.filter((elem, pos) => {
39 | return urls.indexOf(elem) === pos;
40 | })
41 |
42 | for(var i = 0; i < uniqueUrls.length; i++) {
43 | const url = uniqueUrls[i]
44 | const completeUrl = "hooks.slack.com/" + url
45 | console.log(completeUrl)
46 | }
47 | return uniqueUrls.length
48 | }
49 | return 0
50 | }
51 |
52 | async asyncForEach(array, callback) {
53 | if (array.length == 0) {
54 | return
55 | }
56 | var last = array[array.length - 1]
57 | for (const item of array) {
58 | await callback(item);
59 | if(item === last) {
60 | return
61 | }
62 | }
63 | }
64 | }
65 |
66 | module.exports = Core
--------------------------------------------------------------------------------
/src/Github/Github.js:
--------------------------------------------------------------------------------
1 | const puppeteer = require('puppeteer')
2 | const delay = require('delay')
3 |
4 | class Github {
5 | constructor(username, password) {
6 | this.username = username
7 | this.password = password
8 | }
9 |
10 | async login() {
11 | // Uncomment this line and comment the next one if you want to see graphically what this
12 | // Script is doing
13 | //this.browser = await puppeteer.launch({headless: false } /*, slowMo: 250}*/)
14 | this.browser = await puppeteer.launch({
15 | headless: true,
16 | args: ['--no-sandbox'],
17 | });
18 | this.page = await this.browser.newPage()
19 | this.page.setViewport({ width: 1500,
20 | height: 764 });
21 |
22 | await this.page.goto('https://github.com/login')
23 | await this.page.waitFor('input[name=login]', { visible: true })
24 | await this.page.type('input[name=login]', this.username, { delay: 27 })
25 | await this.page.type('input[name=password]', this.password, { delay: 42 })
26 |
27 | await delay(100)
28 | await Promise.all([
29 | this.page.waitForNavigation(),
30 | this.page.keyboard.type('\n')
31 | ])
32 | await delay(100)
33 | }
34 |
35 | async searchCode(q, page, lang, indexed, order) {
36 | var url = 'https://github.com/search?type=Code&q=' + encodeURIComponent(q)
37 |
38 | if (page) {
39 | url = url + '&p=' + page
40 | }
41 |
42 | if (lang) {
43 | url = url + '&l=' + lang
44 | }
45 |
46 | if (indexed) {
47 | url = url + '&s=indexed'
48 | }
49 |
50 | if(order) {
51 | url = url + '&o=' + order
52 | }
53 | await this.page.goto(url, {waitUntil: 'networkidle0'})
54 | const content = await this.page.content();
55 | return content
56 | }
57 | }
58 |
59 | module.exports = Github
--------------------------------------------------------------------------------