├── .gitignore
├── Procfile
├── README.md
├── checkusername.js
├── checkusername.test.js
├── client
├── package-lock.json
├── package.json
├── public
│ ├── download.gif
│ ├── index.html
│ ├── manifest.json
│ └── user.png
├── src
│ ├── App.css
│ ├── App.js
│ ├── Sites.css
│ ├── Sites.js
│ ├── Username.css
│ ├── Username.js
│ ├── index.css
│ ├── index.js
│ └── registerServiceWorker.js
└── yarn.lock
├── index.js
├── package-lock.json
├── package.json
├── sites.json
└── spinner.js
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 |
3 | # Logs
4 | logs
5 | *.log
6 | npm-debug.log*
7 | yarn-debug.log*
8 | yarn-error.log*
9 |
10 | # Runtime data
11 | pids
12 | *.pid
13 | *.seed
14 | *.pid.lock
15 |
16 | # Directory for instrumented libs generated by jscoverage/JSCover
17 | lib-cov
18 |
19 | # Coverage directory used by tools like istanbul
20 | coverage
21 |
22 | # nyc test coverage
23 | .nyc_output
24 |
25 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
26 | .grunt
27 |
28 | # Bower dependency directory (https://bower.io/)
29 | bower_components
30 |
31 | # node-waf configuration
32 | .lock-wscript
33 |
34 | # Compiled binary addons (http://nodejs.org/api/addons.html)
35 | build/Release
36 |
37 | # Dependency directories
38 | node_modules/
39 | jspm_packages/
40 |
41 | # Typescript v1 declaration files
42 | typings/
43 |
44 | # Optional npm cache directory
45 | .npm
46 |
47 | # Optional eslint cache
48 | .eslintcache
49 |
50 | # Optional REPL history
51 | .node_repl_history
52 |
53 | # Output of 'npm pack'
54 | *.tgz
55 |
56 | # Yarn Integrity file
57 | .yarn-integrity
58 |
59 | # dotenv environment variables file
60 | .env
61 |
--------------------------------------------------------------------------------
/Procfile:
--------------------------------------------------------------------------------
1 | web: node index.js
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | [](https://nodei.co/npm/unique-username/)
2 |
3 | 
4 |
5 | [](https://www.codetriage.com/gaurav-shankar/check-username)
6 |
7 |
8 |
9 |
10 |
11 | # Check Username availability across 140+ websites instantly
12 |
13 | Very often while registering to new websites we try to keep the same username across all the websites. Sometimes the username is available and sometimes it’s not. :(
14 |
15 | I created a simple tool using which you can instantly find out if your favorite username is available or not on over 140+ websites.
16 |
17 | ## Installation
18 |
19 | Use [npm](https://www.npmjs.com/package/unique-username) to install username.
20 |
21 | ```bash
22 | npm i unique-username -g //-g to install the project globally
23 | ```
24 |
25 | ## Usage
26 | Check the availability of a particular username across all 140+ websites.
27 | ```bash
28 | username u
29 | ```
30 |
31 | Check the availability of a particular username on a particular website.
32 | ```bash
33 | username d
34 | ```
35 |
36 | Get the list of all supported services
37 | ```bash
38 | username services
39 | ```
40 |
41 | Help
42 | ```bash
43 | username u --help
44 | ```
45 |
46 | ## Contributing
47 | Please raise an issue if you feel something is wrong or a potential bug.
48 | Please raise PR with any changes or additional features that you may like to add.
49 |
50 | You must have the below dependencies before you start working on it.
51 |
52 | Node.js
53 | npm
54 |
55 | Once you've met the dependencies, cd to the project folder and execute this command to run the project with node.
56 |
57 | ```bash
58 | node index.js u
59 | ```
60 | ## License
61 | [MIT](https://choosealicense.com/licenses/mit/)
62 |
--------------------------------------------------------------------------------
/checkusername.js:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env node
2 |
3 | const clc = require("cli-color");
4 | const fetch = require("node-fetch");
5 | const util = require("util");
6 | var fs = require('fs');
7 |
8 | async function fetchResourcesForNextRun() {
9 | try {
10 | await fetch("https://check-user-api.herokuapp.com/api/v1/getServiceNames")
11 | .then(response => {
12 | if (!response.ok) {
13 | throw new Error("HTTP error " + response.status);
14 | }
15 | return response.json();
16 | })
17 | .then(json => {
18 | fs.writeFile("./sites.json", JSON.stringify(json), 'utf8', function (err) {
19 | if (err) {
20 | return err;
21 | }
22 | });
23 | })
24 | }
25 | catch(error) {
26 | }
27 | }
28 |
29 | async function appendUserNameAndSendResult(username,sites) {
30 | fetchResourcesForNextRun();
31 | sites = sites.map(({name,url}) => {return {name,url,class:null}});
32 | let counter = 0;
33 |
34 | for (let site of sites) {
35 | let res;
36 | let url = "https://check-user-api.herokuapp.com/api/v1/"+site.name+"/"+username;
37 | try {
38 | res = await fetch(url)
39 | .then(res => res.json())
40 | .then(json => {
41 | console.log("\n Checking : "+json.appName)
42 | if (json.userNameAvailable === true) {
43 | counter++;
44 | console.log(clc.greenBright(` Username is available to take on ${clc.cyanBright(site.name)}`));
45 | console.log(" "+site.url+ "\n")
46 | }
47 | else if(json.userNameAvailable === false) {
48 | console.log(clc.redBright(` Username already taken on ${clc.cyanBright(site.name)}`));
49 | console.log(" "+site.url+ "\n")
50 | }
51 | })
52 | } catch (err) {
53 | res = {};
54 | }
55 | }
56 |
57 | return {
58 | percentage:stats(counter, username), sites
59 | };
60 |
61 | function stats(counter, username) {
62 | console.log(clc.greenBright(` Username ${username} is available to take on ${counter} out of ${sites.length} websites that we checked`));
63 | }
64 | }
65 |
66 | function printResources(sites) {
67 | sites = sites.map(({name,url}) => {return {name,url,class:null}});
68 | console.log(" List of apps supported.")
69 | for (let site of sites) {
70 | console.log(clc.yellowBright(" "+site.name));
71 | console.log(clc.cyanBright(" "+site.url + "\n"));
72 | }
73 | console.log(" Total "+sites.length+" apps supported currently");
74 | }
75 |
76 | async function getParticularAppUserAvailability(appName,username,sites) {
77 | let url = "https://check-user-api.herokuapp.com/api/v1/"+appName+"/"+username;
78 | try {
79 | res = await fetch(url)
80 | .then(res => res.json())
81 | .then(json => {
82 |
83 | if (json.userNameAvailable === true) {
84 | console.log(clc.greenBright("\n Username is available to take on " +clc.cyanBright(appName)));
85 | console.log(" "+site.url)
86 | }
87 | else if(json.userNameAvailable === false) {
88 | console.log(clc.redBright("\n Username already taken on " +clc.cyanBright(appName)));
89 | console.log(" "+site.url)
90 | }
91 | else{
92 | console.log(clc.redBright(json.errorMessage))
93 | }
94 | })
95 | } catch (err) {
96 | res = {};
97 | }
98 | }
99 |
100 | module.exports = {
101 | printResources,
102 | getParticularAppUserAvailability,
103 | appendUserNameAndSendResult
104 | };
105 |
--------------------------------------------------------------------------------
/checkusername.test.js:
--------------------------------------------------------------------------------
1 | const clc = require("cli-color");
2 | const fetch = require("node-fetch");
3 | const sites = require("./sites");
4 | const { appendUserNameAndSendResult } = require("./checkusername");
5 |
6 | jest.mock("./sites", () => [
7 | {
8 | url: "https://example.com",
9 | name: "site1"
10 | }
11 | ]);
12 | jest.mock("node-fetch", () => jest.fn());
13 | jest.spyOn(global.console, "log");
14 |
15 | test("fetch throws exception", async () => {
16 | fetch.mockImplementation(() => Promise.reject("fake fetch error"));
17 | await expect(appendUserNameAndSendResult("test",sites)).resolves.toMatchObject({
18 | "percentage": "0.00",
19 | "sites": [{"class": "unkown", "name": "site1", "url": "https://example.com"}]
20 | });
21 | expect(console.log).toHaveBeenNthCalledWith(
22 | 2,
23 | clc.redBright(`Could not check the username status ${clc.cyanBright("site1")}\n`)
24 | );
25 | });
--------------------------------------------------------------------------------
/client/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "client",
3 | "version": "0.1.0",
4 | "private": true,
5 | "devDependencies": {
6 | "react-scripts": "1.1.4"
7 | },
8 | "dependencies": {
9 | "react": "^16.8.6",
10 | "react-dom": "^16.8.6",
11 | "npm": "^6.5.0"
12 | },
13 | "scripts": {
14 | "start": "react-scripts start",
15 | "build": "react-scripts build",
16 | "test": "react-scripts test --env=jsdom",
17 | "eject": "react-scripts eject"
18 | },
19 | "engines": {
20 | "node": "^10.10.0"
21 | },
22 | "proxy": "http://localhost:4040",
23 | "browserslist": {
24 | "production": [
25 | ">0.2%",
26 | "not dead",
27 | "not op_mini all"
28 | ],
29 | "development": [
30 | "last 1 chrome version",
31 | "last 1 firefox version",
32 | "last 1 safari version"
33 | ]
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/client/public/download.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Gaurav-Shankar/check-username/2092e218980e3c4e3307793d4ce22f346d916769/client/public/download.gif
--------------------------------------------------------------------------------
/client/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 | Check Username
10 |
11 |
12 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/client/public/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "short_name": "Check Username",
3 | "name": "Check Username",
4 | "icons": [
5 | {
6 | "src": "favicon.ico",
7 | "sizes": "64x64 32x32 24x24 16x16",
8 | "type": "image/x-icon"
9 | }
10 | ],
11 | "start_url": "./index.html",
12 | "display": "standalone",
13 | "theme_color": "#000000",
14 | "background_color": "#ffffff"
15 | }
16 |
--------------------------------------------------------------------------------
/client/public/user.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Gaurav-Shankar/check-username/2092e218980e3c4e3307793d4ce22f346d916769/client/public/user.png
--------------------------------------------------------------------------------
/client/src/App.css:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Gaurav-Shankar/check-username/2092e218980e3c4e3307793d4ce22f346d916769/client/src/App.css
--------------------------------------------------------------------------------
/client/src/App.js:
--------------------------------------------------------------------------------
1 | import React, { useState, useEffect } from 'react';
2 | import './App.css';
3 | import Username from './Username';
4 | import Sites from './Sites';
5 |
6 | const App = () => {
7 | const [sites,setSites] = useState([]);
8 | const [currentSites,setCurrentSites] = useState(sites);
9 | const [percentage,setPercentage] = useState(null);
10 | const [isLoading,setIsLoading] = useState(true);
11 | const [inputValue,setInputValue] = useState('');
12 | const [username,setUsername] = useState(null);
13 | useEffect(() => {
14 | getSites();
15 | },[setSites]);
16 | return (
17 |
23 | );
24 | async function checkUsername(user) {
25 | if (user.length) {
26 | setIsLoading(true);
27 | setUsername(user);
28 | setInputValue('');
29 | setPercentage(null);
30 | fetch(`/api/user/${user}`,{accept:'application/json'})
31 | .then(res=>res.json())
32 | .then(({ percentage, sites }) => {
33 | setIsLoading(false);
34 | setPercentage(percentage);
35 | setCurrentSites(sites);
36 | })
37 | .catch(err=>console.error('user',err))
38 | }
39 | }
40 |
41 | async function getSites() {
42 | setIsLoading(true);
43 | fetch(`/api/sites`,{accept:'application/json'})
44 | .then(res=>res.json())
45 | .then(data => {
46 | setIsLoading(false);
47 | setSites(data);
48 | setCurrentSites(data);
49 | })
50 | .catch(err=>console.error('sites',err))
51 | }
52 | function searchSites(e) {
53 | setCurrentSites(sites.filter(site => ~site.name.indexOf(e.target.value)));
54 | }
55 | }
56 |
57 | export default App;
--------------------------------------------------------------------------------
/client/src/Sites.css:
--------------------------------------------------------------------------------
1 | .sites {
2 | display: grid;
3 | grid-template-columns: repeat(auto-fit, minmax(265px, 1fr));
4 | grid-auto-rows: 94px;
5 | grid-gap: 20px;
6 | margin: 20px;
7 | margin-top:200px;
8 | }
9 |
10 | .site {
11 | display: flex;
12 | border-radius: 15px 50px 30px 5px;
13 | align-items: center;
14 | justify-content: space-between;
15 | padding: 20px;
16 | background-color: #00B4CC;
17 | }
18 |
19 | .avail {
20 | background:#00FF00;
21 | }
22 |
23 | .taken {
24 | background:#FF0000;
25 | }
26 |
27 | .unkown {
28 | background:#C0C0C0;
29 | }
--------------------------------------------------------------------------------
/client/src/Sites.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import './Sites.css';
3 |
4 | const Sites = ({sites}) => (
5 |
6 | {sites.map(site => (
7 |
{site.name}
8 | ))}
9 |
10 | )
11 |
12 | export default Sites;
13 |
--------------------------------------------------------------------------------
/client/src/Username.css:
--------------------------------------------------------------------------------
1 | .user-search {
2 | width: 100%;
3 | position: relative;
4 | display: flex;
5 | margin-bottom:300px;
6 | }
7 |
8 | .search-term {
9 | width: 100%;
10 | border: 3px solid #00B4CC;
11 | border-right: none;
12 | padding: 5px;
13 | height: 20px;
14 | border-radius: 5px 0 0 5px;
15 | outline: none;
16 | color: #9DBFAF;
17 | margin-bottom:300px;
18 | font-size: 20px;
19 | color:black;
20 | }
21 |
22 |
23 |
24 | .search-button {
25 | width: 40px;
26 | height: 36px;
27 | border: 1px solid #00B4CC;
28 | background: #00B4CC;
29 | text-align: center;
30 | color: #ffffff;
31 | border-radius: 0 5px 5px 0;
32 | cursor: pointer;
33 | font-size: 20px;
34 | }
35 |
36 | .wrap{
37 | width: 30%;
38 | position: absolute;
39 | top: 50%;
40 | left: 50%;
41 | transform: translate(-50%, -50%);
42 | }
--------------------------------------------------------------------------------
/client/src/Username.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import './Username.css';
3 |
4 |
5 | const Username = ({ search, setInputValue, checkUsername }) => {
6 | return (
7 |
8 |
9 | setInputValue(e.target.value)} value={search} />
10 |
13 |
14 |
15 | );
16 | }
17 |
18 | export default Username;
19 |
--------------------------------------------------------------------------------
/client/src/index.css:
--------------------------------------------------------------------------------
1 | body {
2 | margin: 0;
3 | padding: 0;
4 | font-family: sans-serif;
5 | box-sizing: border-box;
6 | background:#000000;
7 | }
--------------------------------------------------------------------------------
/client/src/index.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ReactDOM from 'react-dom';
3 | import './index.css';
4 | import App from './App';
5 | import registerServiceWorker from './registerServiceWorker';
6 |
7 | ReactDOM.render( , document.getElementById('root'));
8 | registerServiceWorker();
9 |
--------------------------------------------------------------------------------
/client/src/registerServiceWorker.js:
--------------------------------------------------------------------------------
1 | // In production, we register a service worker to serve assets from local cache.
2 |
3 | // This lets the app load faster on subsequent visits in production, and gives
4 | // it offline capabilities. However, it also means that developers (and users)
5 | // will only see deployed updates on the "N+1" visit to a page, since previously
6 | // cached resources are updated in the background.
7 |
8 | // To learn more about the benefits of this model, read https://goo.gl/KwvDNy.
9 | // This link also includes instructions on opting out of this behavior.
10 |
11 | const isLocalhost = Boolean(
12 | window.location.hostname === 'localhost' ||
13 | // [::1] is the IPv6 localhost address.
14 | window.location.hostname === '[::1]' ||
15 | // 127.0.0.1/8 is considered localhost for IPv4.
16 | window.location.hostname.match(
17 | /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/
18 | )
19 | );
20 |
21 | export default function register() {
22 | if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {
23 | // The URL constructor is available in all browsers that support SW.
24 | const publicUrl = new URL(process.env.PUBLIC_URL, window.location);
25 | if (publicUrl.origin !== window.location.origin) {
26 | // Our service worker won't work if PUBLIC_URL is on a different origin
27 | // from what our page is served on. This might happen if a CDN is used to
28 | // serve assets; see https://github.com/facebookincubator/create-react-app/issues/2374
29 | return;
30 | }
31 |
32 | window.addEventListener('load', () => {
33 | const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;
34 |
35 | if (isLocalhost) {
36 | // This is running on localhost. Lets check if a service worker still exists or not.
37 | checkValidServiceWorker(swUrl);
38 |
39 | // Add some additional logging to localhost, pointing developers to the
40 | // service worker/PWA documentation.
41 | navigator.serviceWorker.ready.then(() => {
42 | console.log(
43 | 'This web app is being served cache-first by a service ' +
44 | 'worker. To learn more, visit https://goo.gl/SC7cgQ'
45 | );
46 | });
47 | } else {
48 | // Is not local host. Just register service worker
49 | registerValidSW(swUrl);
50 | }
51 | });
52 | }
53 | }
54 |
55 | function registerValidSW(swUrl) {
56 | navigator.serviceWorker
57 | .register(swUrl)
58 | .then(registration => {
59 | registration.onupdatefound = () => {
60 | const installingWorker = registration.installing;
61 | installingWorker.onstatechange = () => {
62 | if (installingWorker.state === 'installed') {
63 | if (navigator.serviceWorker.controller) {
64 | // At this point, the old content will have been purged and
65 | // the fresh content will have been added to the cache.
66 | // It's the perfect time to display a "New content is
67 | // available; please refresh." message in your web app.
68 | console.log('New content is available; please refresh.');
69 | } else {
70 | // At this point, everything has been precached.
71 | // It's the perfect time to display a
72 | // "Content is cached for offline use." message.
73 | console.log('Content is cached for offline use.');
74 | }
75 | }
76 | };
77 | };
78 | })
79 | .catch(error => {
80 | console.error('Error during service worker registration:', error);
81 | });
82 | }
83 |
84 | function checkValidServiceWorker(swUrl) {
85 | // Check if the service worker can be found. If it can't reload the page.
86 | fetch(swUrl)
87 | .then(response => {
88 | // Ensure service worker exists, and that we really are getting a JS file.
89 | if (
90 | response.status === 404 ||
91 | response.headers.get('content-type').indexOf('javascript') === -1
92 | ) {
93 | // No service worker found. Probably a different app. Reload the page.
94 | navigator.serviceWorker.ready.then(registration => {
95 | registration.unregister().then(() => {
96 | window.location.reload();
97 | });
98 | });
99 | } else {
100 | // Service worker found. Proceed as normal.
101 | registerValidSW(swUrl);
102 | }
103 | })
104 | .catch(() => {
105 | console.log(
106 | 'No internet connection found. App is running in offline mode.'
107 | );
108 | });
109 | }
110 |
111 | export function unregister() {
112 | if ('serviceWorker' in navigator) {
113 | navigator.serviceWorker.ready.then(registration => {
114 | registration.unregister();
115 | });
116 | }
117 | }
118 |
--------------------------------------------------------------------------------
/index.js:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env node
2 |
3 | const program = require('commander');
4 | var checkusername = require('./checkusername');
5 | var clc = require("cli-color");
6 | const express = require('express');
7 | const sites = require("./sites");
8 | const open = require('open');
9 |
10 | const countdown = require('./spinner');
11 |
12 | program
13 | .command('u ')
14 | .description('Check username availability across 140+ major websites!')
15 | .action(async function(name, options){
16 | console.log(clc.green(' Checking username: %s'), name);
17 | countdown.start();
18 | await checkusername.appendUserNameAndSendResult(name,sites)
19 | countdown.stop();
20 | process.exit(1);
21 | });
22 |
23 | program
24 | .command('services')
25 | .description('Get the list of all supported services.')
26 | .action(async function(){
27 | await checkusername.printResources(sites)
28 | process.exit(1);
29 | });
30 |
31 | program
32 | .command('d ')
33 | .description('Check the availability of your username on a partcular serivce.')
34 | .action(async function(service,name, options){
35 | console.log(clc.green(' Checking username: %s'), name);
36 | console.log(clc.green(' Checking app: %s'), service);
37 | countdown.start();
38 | await checkusername.getParticularAppUserAvailability(service,name,sites)
39 | countdown.stop();
40 | process.exit(1);
41 | });
42 |
43 | program
44 | .command('support')
45 | .description('If you enjoyed using the app, please consider supporting what I do. This will open your default browser.')
46 | .action(async function(){
47 | await open('https://ko-fi.com/grv_19')
48 | process.exit(1);
49 | });
50 |
51 | program.on('command:*', function() {
52 | console.log("\n");
53 | console.error(clc.redBright('Invalid command: %s\nSee --help for the list of available commands.'), program.args.join(' '));
54 | console.log("\n");
55 | process.exit(1);
56 | });
57 |
58 | program
59 | .version('4.0.0')
60 |
61 | program.parse(process.argv);
62 |
63 | const app = express();
64 | const port = process.env.PORT || 4040;
65 |
66 | process.env.NODE_ENV === 'production' && app.use(express.static('client/build'));
67 |
68 | app.get('/api/user/:_user', async function(req, res) {
69 | res.json(await checkusername.appendUserNameAndSendResult(req.params._user,sites));
70 | });
71 |
72 | app.get('/api/sites', (req, res) => {
73 | res.json(sites);
74 | });
75 |
76 | app.get('/api/sites/:_name', (req, res) => {
77 | res.json(sites.find(({name}) => name === req.params._name));
78 | });
79 |
80 | app.listen(port, () => console.log());
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "unique-username",
3 | "version": "4.1.0",
4 | "description": "How unique is your username?",
5 | "main": "index.js",
6 | "repository": {
7 | "type": "git",
8 | "url": "git@github.com:Gaurav-Shankar/check-username.git"
9 | },
10 | "author": "Gaurav Shankar",
11 | "license": "MIT",
12 | "bugs": {
13 | "url": "https://github.com/Gaurav-Shankar/check-username/issues"
14 | },
15 | "preferGlobal": true,
16 | "bin": {
17 | "username": "index.js"
18 | },
19 | "scripts": {
20 | "start": "concurrently \"cd client/ && npm start\" \"nodemon index.js\"",
21 | "setup": "cd client/ && npm install && cd .. && npm install && npm start",
22 | "heroku-postbuild": "cd client/ && npm install --only=dev && npm install && npm run build",
23 | "test": "jest"
24 | },
25 | "engines": {
26 | "node": "^10.10.0"
27 | },
28 | "dependencies": {
29 | "cli-color": "^1.4.0",
30 | "clui": "^0.3.6",
31 | "commander": "^2.20.0",
32 | "express": "^4.16.4",
33 | "node-fetch": "^2.5.0",
34 | "npm": "^6.5.0",
35 | "open": "^6.3.0",
36 | "opn": "^6.0.0"
37 | },
38 | "devDependencies": {
39 | "jest": "^24.7.1",
40 | "concurrently": "^4.1.0",
41 | "nodemon": "^1.19.0"
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/sites.json:
--------------------------------------------------------------------------------
1 | [{"name":"Photobucket","url":"https://photobucket.com/"},{"name":"HackerOne","url":"https://hackerone.com/"},{"name":"About.me","url":"https://about.me/"},{"name":"last.fm","url":"https://last.fm/"},{"name":"YouPic","url":"https://youpic.com/"},{"name":"9GAG","url":"https://9gag.com/"},{"name":"Twitch","url":"https://www.twitch.tv/"},{"name":"Pastebin","url":"https://pastebin.com/"},{"name":"Canva","url":"https://www.canva.com/"},{"name":"Crunchyroll","url":"https://www.crunchyroll.com/"},{"name":"SlideShare","url":"https://slideshare.net/"},{"name":"CashMe","url":"https://cash.me/"},{"name":"Gumroad","url":"https://www.gumroad.com/"},{"name":"EVE Online","url":"https://eveonline.com"},{"name":"Etsy","url":"https://www.etsy.com/"},{"name":"Quora","url":"https://www.quora.com/"},{"name":"Badoo","url":"https://badoo.com/"},{"name":"iMGSRC.RU","url":"https://imgsrc.ru/"},{"name":"EyeEm","url":"https://www.eyeem.com/"},{"name":"WebNode","url":"https://www.webnode.cz/"},{"name":"GitHub","url":"https://github.com/"},{"name":"Codepen","url":"https://codepen.io/"},{"name":"LiveJournal","url":"https://www.livejournal.com/"},{"name":"Slack","url":"https://slack.com"},{"name":"CreativeMarket","url":"https://creativemarket.com/"},{"name":"Instructables","url":"https://www.instructables.com/"},{"name":"Pixabay","url":"https://pixabay.com/"},{"name":"devRant","url":"https://devrant.com/"},{"name":"House-Mixes.com","url":"https://www.house-mixes.com/"},{"name":"Mastodon","url":"https://mastodon.social/"},{"name":"Wix","url":"https://wix.com/"},{"name":"Kaggle","url":"https://www.kaggle.com/"},{"name":"Spotify","url":"https://open.spotify.com/"},{"name":"Academia.edu","url":"https://www.academia.edu/"},{"name":"Reddit","url":"https://www.reddit.com/"},{"name":"Keybase","url":"https://keybase.io/"},{"name":"ProductHunt","url":"https://www.producthunt.com/"},{"name":"VirusTotal","url":"https://www.virustotal.com/"},{"name":"Gravatar","url":"http://en.gravatar.com/"},{"name":"Cloob","url":"https://www.cloob.com/"},{"name":"npm","url":"https://www.npmjs.com/"},{"name":"Roblox","url":"https://www.roblox.com/"},{"name":"Kongregate","url":"https://www.kongregate.com/"},{"name":"Ebay","url":"https://www.ebay.com/"},{"name":"GoodReads","url":"https://www.goodreads.com/"},{"name":"Wikia","url":"http://www.wikia.com/"},{"name":"Venmo","url":"https://venmo.com/"},{"name":"BugCrowd","url":"https://bugcrowd.com/"},{"name":"VK","url":"https://vk.com/"},{"name":"Disqus","url":"https://disqus.com/"},{"name":"Vimeo","url":"https://vimeo.com/"},{"name":"BitCoinForum","url":"https://bitcoinforum.com"},{"name":"Designspiration","url":"https://www.designspiration.net/"},{"name":"TradingView","url":"https://www.tradingview.com/"},{"name":"MeetMe","url":"https://www.meetme.com/"},{"name":"HackerNews","url":"https://news.ycombinator.com/"},{"name":"Unsplash","url":"https://unsplash.com/"},{"name":"BitBucket","url":"https://bitbucket.org/"},{"name":"500px","url":"https://500px.com/"},{"name":"Behance","url":"https://www.behance.net/"},{"name":"Issuu","url":"https://issuu.com/"},{"name":"Dribbble","url":"https://dribbble.com/"},{"name":"Contently","url":"https://contently.com/"},{"name":"Steam","url":"https://steamcommunity.com/"},{"name":"MyAnimeList","url":"https://myanimelist.net/"},{"name":"tunein","url":"https://tunein.com/user/"},{"name":"GitLab","url":"https://gitlab.com/"},{"name":"Telegram","url":"https://t.me/"},{"name":"Pinterest","url":"https://www.pinterest.com/"},{"name":"Kik","url":"http://kik.me/"},{"name":"Gitee","url":"https://gitee.com/"},{"name":"ReverbNation","url":"https://www.reverbnation.com/"},{"name":"TripAdvisor","url":"https://tripadvisor.com/"},{"name":"Investing.com","url":"https://www.investing.com/"},{"name":"Blogger","url":"https://www.blogger.com/"},{"name":"ImageShack","url":"https://imageshack.us/"},{"name":"Aptoide","url":"https://en.aptoide.com/"},{"name":"Plug.DJ","url":"https://plug.dj/"},{"name":"SteamGroup","url":"https://steamcommunity.com/"},{"name":"DEV Community","url":"https://dev.to/"},{"name":"Zhihu","url":"https://www.zhihu.com/"},{"name":"AngelList","url":"https://angel.co/"},{"name":"Giphy","url":"https://giphy.com/"},{"name":"Launchpad","url":"https://launchpad.net/"},{"name":"Foursquare","url":"https://foursquare.com/"},{"name":"Rajce.net","url":"https://www.rajce.idnes.cz/"},{"name":"Trip","url":"https://www.trip.skyscanner.com/"},{"name":"Twitter","url":"https://twitter.com/"},{"name":"Flipboard","url":"https://flipboard.com/"},{"name":"Ello","url":"https://ello.co/"},{"name":"ColourLovers","url":"https://www.colourlovers.com/"},{"name":"Facebook","url":"https://www.facebook.com/"},{"name":"Bandcamp","url":"https://bandcamp.com/"},{"name":"Carbonmade","url":"https://carbonmade.com/"},{"name":"Instagram","url":"https://www.instagram.com/"},{"name":"Trakt","url":"https://www.trakt.tv/"},{"name":"SourceForge","url":"https://sourceforge.net/"},{"name":"Coroflot","url":"https://coroflot.com/"},{"name":"BuzzFeed","url":"https://www.buzzfeed.com/"},{"name":"SoundCloud","url":"https://soundcloud.com/"},{"name":"KanoWorld","url":"https://world.kano.me/"},{"name":"Newgrounds","url":"https://newgrounds.com"},{"name":"Makerlog","url":"https://getmakerlog.com/"},{"name":"NameMC","url":"https://namemc.com/"},{"name":"We Heart It","url":"https://weheartit.com/"},{"name":"HubPages","url":"https://hubpages.com/"},{"name":"Basecamp","url":"https://basecamp.com/"},{"name":"Imgur","url":"https://imgur.com/"},{"name":"Flickr","url":"https://www.flickr.com/"},{"name":"Taringa","url":"https://taringa.net/"},{"name":"Jimdo","url":"https://jimdosite.com/"},{"name":"Wattpad","url":"https://www.wattpad.com/"},{"name":"Medium","url":"https://medium.com/"},{"name":"Coderwall","url":"https://coderwall.com/"},{"name":"Pexels","url":"https://www.pexels.com/"},{"name":"Crevado","url":"https://crevado.com/"},{"name":"Signal","url":"https://community.signalusers.org"},{"name":"Tinder","url":"https://tinder.com/"},{"name":"Itch.io","url":"https://itch.io/"},{"name":"Repl.it","url":"https://repl.it/"},{"name":"Letterboxd","url":"https://letterboxd.com/"},{"name":"WordPress","url":"https://wordpress.com"},{"name":"IFTTT","url":"https://www.ifttt.com/"},{"name":"Scribd","url":"https://www.scribd.com/"},{"name":"BLIP.fm","url":"https://blip.fm/"},{"name":"DeviantART","url":"https://www.deviantart.com"},{"name":"MixCloud","url":"https://www.mixcloud.com/"},{"name":"DailyMotion","url":"https://www.dailymotion.com/"},{"name":"YouTube","url":"https://www.youtube.com/"},{"name":"Codementor","url":"https://www.codementor.io/"},{"name":"Houzz","url":"https://houzz.com/"},{"name":"hackerearth","url":"https://www.hackerearth.com/"},{"name":"Patreon","url":"https://www.patreon.com/"},{"name":"VSCO","url":"https://vsco.co/"},{"name":"Smashcast","url":"https://www.smashcast.tv/"},{"name":"Wikipedia","url":"https://www.wikipedia.org/"},{"name":"Star Citizen","url":"https://robertsspaceindustries.com/"},{"name":"Codecademy","url":"https://www.codecademy.com/"}]
--------------------------------------------------------------------------------
/spinner.js:
--------------------------------------------------------------------------------
1 | 'use strict'
2 |
3 | const CLI = require('clui');
4 | const Spinner = CLI.Spinner;
5 |
6 | const spinner = new Spinner('Fetching username availability ... ', ['🖲','💻','👩🏻💻','👨🏻💻','🤓','💻','🖱','🎮']);
7 |
8 | module.exports = spinner;
--------------------------------------------------------------------------------