From 1af9e596447321b6456da95170b76872a6a5e7ed Mon Sep 17 00:00:00 2001 From: Jesper Wrang Date: Sun, 14 Jan 2018 14:41:00 +0100 Subject: [PATCH] Started linting the code with eslint --- .eslintrc.json | 48 ++ package-lock.json | 963 +++++++++++++++++++++++ package.json | 9 +- src/js/App.js | 54 +- src/js/components/Comment.js | 55 +- src/js/components/CommentSection.js | 12 +- src/js/components/Menu.js | 32 +- src/js/components/StatusBox.js | 38 +- src/js/components/SubredditPagination.js | 38 +- src/js/components/SubredditSort.js | 36 +- src/js/components/ThreadHead.js | 110 +-- src/js/components/ThreadInfo.js | 19 +- src/js/index.js | 15 +- src/js/pages/About.js | 84 +- src/js/pages/Search.js | 134 ++-- src/js/pages/Subreddit.js | 14 +- src/js/pages/Thread.js | 51 +- src/js/pages/index.js | 6 +- src/js/pushshift/index.js | 63 +- src/js/reddit/clientID.js | 2 +- src/js/reddit/index.js | 534 ++++++------- src/js/state/index.js | 8 +- src/js/state/status.js | 70 +- src/js/utils/index.js | 50 +- 24 files changed, 1726 insertions(+), 719 deletions(-) create mode 100644 .eslintrc.json diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..1f40a24 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,48 @@ +{ + "extends": "airbnb", + "env": { + "browser": true + }, + "rules": { + "semi": "off", + "arrow-parens": "off", + "no-unused-vars": "warn", + "react/jsx-filename-extension": "off", + "react/prop-types": "off", + "jsx-quotes": "off", + "no-script-url": "off", + "max-len": "warn", + "import/no-extraneous-dependencies": "off", + "import/no-unresolved": "off", + "import/extensions": "off", + "react/no-danger": "off", + "no-underscore-dangle": "off", + "no-param-reassign": "warn", + "jsx-a11y/anchor-has-content": "off", + "jsx-a11y/anchor-is-valid": [ + "error", + { + "components": [ "Link" ], + "specialLink": [ "to", "hrefLeft", "hrefRight" ], + "aspects": [ "noHref", "invalidHref", "preferButton" ] + } + ], + + "no-plusplus": [ + "error", + { + "allowForLoopAfterthoughts": true + } + ], + "comma-dangle": [ + "error", + { + "arrays": "always-multiline", + "objects": "always-multiline", + "imports": "always-multiline", + "exports": "always-multiline", + "functions": "ignore" + } + ] + } +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 278df68..a99f3f9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -632,6 +632,23 @@ } } }, + "acorn-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", + "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", + "dev": true, + "requires": { + "acorn": "3.3.0" + }, + "dependencies": { + "acorn": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", + "dev": true + } + } + }, "ajv": { "version": "5.5.2", "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", @@ -673,6 +690,12 @@ "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", "dev": true }, + "ansi-escapes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.0.0.tgz", + "integrity": "sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ==", + "dev": true + }, "ansi-html": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", @@ -729,6 +752,15 @@ "sprintf-js": "1.0.3" } }, + "aria-query": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-0.7.0.tgz", + "integrity": "sha512-/r2lHl09V3o74+2MLKEdewoj37YZqiQZnfen1O4iNlrOjUgeKuu1U2yF3iKh6HJxqF+OXkLMfQv65Z/cvxD6vA==", + "dev": true, + "requires": { + "ast-types-flow": "0.0.7" + } + }, "arr-diff": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", @@ -848,6 +880,12 @@ "integrity": "sha1-ECyenpAF0+fjgpvwxPok7oYu6bk=", "dev": true }, + "ast-types-flow": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", + "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=", + "dev": true + }, "async": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", @@ -907,6 +945,15 @@ "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", "dev": true }, + "axobject-query": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-0.1.0.tgz", + "integrity": "sha1-YvWdvFnJ+SQnWco0mWDnov48NsA=", + "dev": true, + "requires": { + "ast-types-flow": "0.0.7" + } + }, "babel-code-frame": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", @@ -945,6 +992,98 @@ } } }, + "babel-eslint": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-8.2.1.tgz", + "integrity": "sha512-RzdVOyWKQRUnLXhwLk+eKb4oyW+BykZSkpYwFhM4tnfzAG5OWfvG0w/uyzMp5XKEU0jN82+JefHr39bG2+KhRQ==", + "dev": true, + "requires": { + "@babel/code-frame": "7.0.0-beta.36", + "@babel/traverse": "7.0.0-beta.36", + "@babel/types": "7.0.0-beta.36", + "babylon": "7.0.0-beta.36", + "eslint-scope": "3.7.1", + "eslint-visitor-keys": "1.0.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.0.0-beta.36", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.36.tgz", + "integrity": "sha512-sW77BFwJ48YvQp3Gzz5xtAUiXuYOL2aMJKDwiaY3OcvdqBFurtYfOpSa4QrNyDxmOGRFSYzUpabU2m9QrlWE7w==", + "dev": true, + "requires": { + "chalk": "2.3.0", + "esutils": "2.0.2", + "js-tokens": "3.0.2" + } + }, + "@babel/helper-function-name": { + "version": "7.0.0-beta.36", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.36.tgz", + "integrity": "sha512-/SGPOyifPf20iTrMN+WdlY2MbKa7/o4j7B/4IAsdOusASp2icT+Wcdjf4tjJHaXNX8Pe9bpgVxLNxhRvcf8E5w==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "7.0.0-beta.36", + "@babel/template": "7.0.0-beta.36", + "@babel/types": "7.0.0-beta.36" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0-beta.36", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.36.tgz", + "integrity": "sha512-vPPcx2vsSoDbcyWr9S3nd0FM3B4hEXnt0p1oKpwa08GwK0fSRxa98MyaRGf8suk8frdQlG1P3mDrz5p/Rr3pbA==", + "dev": true, + "requires": { + "@babel/types": "7.0.0-beta.36" + } + }, + "@babel/template": { + "version": "7.0.0-beta.36", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.0.0-beta.36.tgz", + "integrity": "sha512-mUBi90WRyZ9iVvlWLEdeo8gn/tROyJdjKNC4W5xJTSZL+9MS89rTJSqiaJKXIkxk/YRDL/g/8snrG/O0xl33uA==", + "dev": true, + "requires": { + "@babel/code-frame": "7.0.0-beta.36", + "@babel/types": "7.0.0-beta.36", + "babylon": "7.0.0-beta.36", + "lodash": "4.17.4" + } + }, + "@babel/traverse": { + "version": "7.0.0-beta.36", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.0.0-beta.36.tgz", + "integrity": "sha512-OTUb6iSKVR/98dGThRJ1BiyfwbuX10BVnkz89IpaerjTPRhDfMBfLsqmzxz5MiywUOW4M0Clta0o7rSxkfcuzw==", + "dev": true, + "requires": { + "@babel/code-frame": "7.0.0-beta.36", + "@babel/helper-function-name": "7.0.0-beta.36", + "@babel/types": "7.0.0-beta.36", + "babylon": "7.0.0-beta.36", + "debug": "3.1.0", + "globals": "11.1.0", + "invariant": "2.2.2", + "lodash": "4.17.4" + } + }, + "@babel/types": { + "version": "7.0.0-beta.36", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.36.tgz", + "integrity": "sha512-PyAORDO9um9tfnrddXgmWN9e6Sq9qxraQIt5ynqBOSXKA5qvK1kUr+Q3nSzKFdzorsiK+oqcUnAFvEoKxv9D+Q==", + "dev": true, + "requires": { + "esutils": "2.0.2", + "lodash": "4.17.4", + "to-fast-properties": "2.0.0" + } + }, + "babylon": { + "version": "7.0.0-beta.36", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.36.tgz", + "integrity": "sha512-rw4YdadGwajAMMRl6a5swhQ0JCOOFyaYCfJ0AsmNBD8uBD/r4J8mux7wBaqavvFKqUKQYWOzA1Speams4YDzsQ==", + "dev": true + } + } + }, "babel-loader": { "version": "8.0.0-beta.0", "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.0-beta.0.tgz", @@ -1318,6 +1457,21 @@ } } }, + "caller-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", + "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", + "dev": true, + "requires": { + "callsites": "0.2.0" + } + }, + "callsites": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "dev": true + }, "camel-case": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", @@ -1397,6 +1551,12 @@ "supports-color": "4.5.0" } }, + "chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", + "dev": true + }, "chokidar": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", @@ -1430,6 +1590,12 @@ "safe-buffer": "5.1.1" } }, + "circular-json": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", + "dev": true + }, "clap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/clap/-/clap-1.2.3.tgz", @@ -1570,6 +1736,21 @@ "rimraf": "2.6.2" } }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "2.0.0" + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, "cliui": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", @@ -1799,6 +1980,12 @@ "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", "dev": true }, + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true + }, "content-disposition": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", @@ -2152,6 +2339,12 @@ "es5-ext": "0.10.37" } }, + "damerau-levenshtein": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.4.tgz", + "integrity": "sha1-AxkcQyy27qFou3fzpV/9zLiXhRQ=", + "dev": true + }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -2208,6 +2401,12 @@ "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", "dev": true }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, "define-properties": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", @@ -2356,6 +2555,15 @@ "buffer-indexof": "1.1.1" } }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "2.0.2" + } + }, "dom-converter": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.1.4.tgz", @@ -2480,6 +2688,12 @@ "minimalistic-crypto-utils": "1.0.1" } }, + "emoji-regex": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-6.5.1.tgz", + "integrity": "sha512-PAHp6TxrCy7MGMFidro8uikr+zlJJKJ/Q6mm2ExZ7HwkyR9lSVFfE3kt36qcwa24BQL7y0G9axycGjK1A/0uNQ==", + "dev": true + }, "emojis-list": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", @@ -2673,12 +2887,356 @@ "estraverse": "4.2.0" } }, + "eslint": { + "version": "4.15.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.15.0.tgz", + "integrity": "sha512-zEO/Z1ZUxIQ+MhDVKkVTUYpIPDTEJLXGMrkID+5v1NeQHtCz6FZikWuFRgxE1Q/RV2V4zVl1u3xmpPADHhMZ6A==", + "dev": true, + "requires": { + "ajv": "5.5.2", + "babel-code-frame": "6.26.0", + "chalk": "2.3.0", + "concat-stream": "1.6.0", + "cross-spawn": "5.1.0", + "debug": "3.1.0", + "doctrine": "2.1.0", + "eslint-scope": "3.7.1", + "eslint-visitor-keys": "1.0.0", + "espree": "3.5.2", + "esquery": "1.0.0", + "esutils": "2.0.2", + "file-entry-cache": "2.0.0", + "functional-red-black-tree": "1.0.1", + "glob": "7.1.2", + "globals": "11.1.0", + "ignore": "3.3.7", + "imurmurhash": "0.1.4", + "inquirer": "3.3.0", + "is-resolvable": "1.0.1", + "js-yaml": "3.10.0", + "json-stable-stringify-without-jsonify": "1.0.1", + "levn": "0.3.0", + "lodash": "4.17.4", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "natural-compare": "1.4.0", + "optionator": "0.8.2", + "path-is-inside": "1.0.2", + "pluralize": "7.0.0", + "progress": "2.0.0", + "require-uncached": "1.0.3", + "semver": "5.4.1", + "strip-ansi": "4.0.0", + "strip-json-comments": "2.0.1", + "table": "4.0.2", + "text-table": "0.2.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "4.1.1", + "shebang-command": "1.2.0", + "which": "1.3.0" + } + }, + "esprima": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", + "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", + "dev": true + }, + "js-yaml": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz", + "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==", + "dev": true, + "requires": { + "argparse": "1.0.9", + "esprima": "4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + } + } + }, + "eslint-config-airbnb": { + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-16.1.0.tgz", + "integrity": "sha512-zLyOhVWhzB/jwbz7IPSbkUuj7X2ox4PHXTcZkEmDqTvd0baJmJyuxlFPDlZOE/Y5bC+HQRaEkT3FoHo9wIdRiw==", + "dev": true, + "requires": { + "eslint-config-airbnb-base": "12.1.0" + } + }, + "eslint-config-airbnb-base": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-12.1.0.tgz", + "integrity": "sha512-/vjm0Px5ZCpmJqnjIzcFb9TKZrKWz0gnuG/7Gfkt0Db1ELJR51xkZth+t14rYdqWgX836XbuxtArbIHlVhbLBA==", + "dev": true, + "requires": { + "eslint-restricted-globals": "0.1.1" + } + }, + "eslint-import-resolver-node": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz", + "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==", + "dev": true, + "requires": { + "debug": "2.6.9", + "resolve": "1.5.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "eslint-module-utils": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.1.1.tgz", + "integrity": "sha512-jDI/X5l/6D1rRD/3T43q8Qgbls2nq5km5KSqiwlyUbGo5+04fXhMKdCPhjwbqAa6HXWaMxj8Q4hQDIh7IadJQw==", + "dev": true, + "requires": { + "debug": "2.6.9", + "pkg-dir": "1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "2.0.1" + } + }, + "pkg-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", + "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "dev": true, + "requires": { + "find-up": "1.1.2" + } + } + } + }, + "eslint-plugin-import": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.8.0.tgz", + "integrity": "sha512-Rf7dfKJxZ16QuTgVv1OYNxkZcsu/hULFnC+e+w0Gzi6jMC3guQoWQgxYxc54IDRinlb6/0v5z/PxxIKmVctN+g==", + "dev": true, + "requires": { + "builtin-modules": "1.1.1", + "contains-path": "0.1.0", + "debug": "2.6.9", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "0.3.2", + "eslint-module-utils": "2.1.1", + "has": "1.0.1", + "lodash.cond": "4.5.2", + "minimatch": "3.0.4", + "read-pkg-up": "2.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "requires": { + "esutils": "2.0.2", + "isarray": "1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "strip-bom": "3.0.0" + } + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "2.3.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "2.0.0", + "normalize-package-data": "2.4.0", + "path-type": "2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "2.1.0", + "read-pkg": "2.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } + } + }, + "eslint-plugin-jsx-a11y": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.0.3.tgz", + "integrity": "sha1-VFg9GuRCSDFi4EDhPMMYZUZRAOU=", + "dev": true, + "requires": { + "aria-query": "0.7.0", + "array-includes": "3.0.3", + "ast-types-flow": "0.0.7", + "axobject-query": "0.1.0", + "damerau-levenshtein": "1.0.4", + "emoji-regex": "6.5.1", + "jsx-ast-utils": "2.0.1" + } + }, + "eslint-plugin-react": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.5.1.tgz", + "integrity": "sha512-YGSjB9Qu6QbVTroUZi66pYky3DfoIPLdHQ/wmrBGyBRnwxQsBXAov9j2rpXt/55i8nyMv6IRWJv2s4d4YnduzQ==", + "dev": true, + "requires": { + "doctrine": "2.1.0", + "has": "1.0.1", + "jsx-ast-utils": "2.0.1", + "prop-types": "15.6.0" + } + }, + "eslint-restricted-globals": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/eslint-restricted-globals/-/eslint-restricted-globals-0.1.1.tgz", + "integrity": "sha1-NfDVy8ZMLj7WLpO0saevBbp+1Nc=", + "dev": true + }, + "eslint-scope": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", + "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", + "dev": true, + "requires": { + "esrecurse": "4.2.0", + "estraverse": "4.2.0" + } + }, + "eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", + "dev": true + }, + "espree": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.2.tgz", + "integrity": "sha512-sadKeYwaR/aJ3stC2CdvgXu1T16TdYN+qwCpcWbMnGJ8s0zNWemzrvb2GbD4OhmJ/fwpJjudThAlLobGbWZbCQ==", + "dev": true, + "requires": { + "acorn": "5.3.0", + "acorn-jsx": "3.0.1" + } + }, "esprima": { "version": "2.7.3", "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", "dev": true }, + "esquery": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz", + "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", + "dev": true, + "requires": { + "estraverse": "4.2.0" + } + }, "esrecurse": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", @@ -2876,6 +3434,17 @@ "is-extendable": "0.1.1" } }, + "external-editor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.1.0.tgz", + "integrity": "sha512-E44iT5QVOUJBKij4IIV3uvxuNlbKS38Tw1HiupxEIHPv9qtC2PrDYohbXV5U+1jnfIXttny8gUhj+oZvflFlzA==", + "dev": true, + "requires": { + "chardet": "0.4.2", + "iconv-lite": "0.4.19", + "tmp": "0.0.33" + } + }, "extglob": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", @@ -2915,6 +3484,12 @@ "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", "dev": true }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, "fastparse": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz", @@ -2951,6 +3526,25 @@ } } }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "1.0.5" + } + }, + "file-entry-cache": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", + "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", + "dev": true, + "requires": { + "flat-cache": "1.3.0", + "object-assign": "4.1.1" + } + }, "filename-regex": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", @@ -3016,6 +3610,55 @@ "locate-path": "2.0.0" } }, + "flat-cache": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", + "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", + "dev": true, + "requires": { + "circular-json": "0.3.3", + "del": "2.2.2", + "graceful-fs": "4.1.11", + "write": "0.2.1" + }, + "dependencies": { + "del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "dev": true, + "requires": { + "globby": "5.0.0", + "is-path-cwd": "1.0.0", + "is-path-in-cwd": "1.0.0", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "rimraf": "2.6.2" + } + }, + "globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "dev": true, + "requires": { + "array-union": "1.0.2", + "arrify": "1.0.1", + "glob": "7.1.2", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, "flatten": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz", @@ -4058,6 +4701,12 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, "gauge": { "version": "2.7.4", "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", @@ -4812,6 +5461,61 @@ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", "dev": true }, + "inquirer": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", + "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", + "dev": true, + "requires": { + "ansi-escapes": "3.0.0", + "chalk": "2.3.0", + "cli-cursor": "2.1.0", + "cli-width": "2.2.0", + "external-editor": "2.1.0", + "figures": "2.0.0", + "lodash": "4.17.4", + "mute-stream": "0.0.7", + "run-async": "2.3.0", + "rx-lite": "4.0.8", + "rx-lite-aggregates": "4.0.8", + "string-width": "2.1.1", + "strip-ansi": "4.0.0", + "through": "2.3.8" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + } + } + }, "internal-ip": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-1.2.0.tgz", @@ -5108,6 +5812,12 @@ "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", "dev": true }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, "is-property": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", @@ -5123,6 +5833,12 @@ "has": "1.0.1" } }, + "is-resolvable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.1.tgz", + "integrity": "sha512-y5CXYbzvB3jTnWAZH1Nl7ykUWb6T3BcTs56HUruwBf8MhF56n1HWqhDWnVFo8GHrUPDgvUUNVhrc2U8W7iqz5g==", + "dev": true + }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", @@ -5256,6 +5972,12 @@ "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", "dev": true }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", @@ -5309,6 +6031,15 @@ } } }, + "jsx-ast-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz", + "integrity": "sha1-6AGxs5mF4g//yHtA43SAgOLcrH8=", + "dev": true, + "requires": { + "array-includes": "3.0.3" + } + }, "killable": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.0.tgz", @@ -5339,6 +6070,16 @@ "invert-kv": "1.0.0" } }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "1.1.2", + "type-check": "0.3.2" + } + }, "load-json-file": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", @@ -5415,6 +6156,12 @@ "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", "dev": true }, + "lodash.cond": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/lodash.cond/-/lodash.cond-4.5.2.tgz", + "integrity": "sha1-9HGh2khr5g9quVXRcRVSPdHSVdU=", + "dev": true + }, "lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", @@ -5799,6 +6546,12 @@ "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", "dev": true }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, "nan": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.8.0.tgz", @@ -5844,6 +6597,12 @@ } } }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, "ncname": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/ncname/-/ncname-1.0.0.tgz", @@ -6237,6 +6996,15 @@ "wrappy": "1.0.2" } }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "1.1.0" + } + }, "opn": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/opn/-/opn-5.1.0.tgz", @@ -6246,6 +7014,28 @@ "is-wsl": "1.1.0" } }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, + "requires": { + "deep-is": "0.1.3", + "fast-levenshtein": "2.0.6", + "levn": "0.3.0", + "prelude-ls": "1.1.2", + "type-check": "0.3.2", + "wordwrap": "1.0.0" + }, + "dependencies": { + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + } + } + }, "original": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/original/-/original-1.0.0.tgz", @@ -6525,6 +7315,12 @@ "find-up": "2.1.0" } }, + "pluralize": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", + "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", + "dev": true + }, "portfinder": { "version": "1.0.13", "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.13.tgz", @@ -7050,6 +7846,12 @@ "uniqs": "2.0.0" } }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, "prepend-http": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", @@ -7090,6 +7892,12 @@ "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", "dev": true }, + "progress": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", + "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=", + "dev": true + }, "promise": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", @@ -7728,6 +8536,24 @@ "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", "dev": true }, + "require-uncached": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", + "dev": true, + "requires": { + "caller-path": "0.1.0", + "resolve-from": "1.0.1" + }, + "dependencies": { + "resolve-from": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", + "dev": true + } + } + }, "requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -7769,6 +8595,16 @@ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", "dev": true }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "2.0.1", + "signal-exit": "3.0.2" + } + }, "right-align": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", @@ -7797,6 +8633,15 @@ "inherits": "2.0.3" } }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "dev": true, + "requires": { + "is-promise": "2.1.0" + } + }, "run-queue": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", @@ -7806,6 +8651,21 @@ "aproba": "1.2.0" } }, + "rx-lite": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", + "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", + "dev": true + }, + "rx-lite-aggregates": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", + "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", + "dev": true, + "requires": { + "rx-lite": "4.0.8" + } + }, "safe-buffer": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", @@ -8074,6 +8934,23 @@ "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", "dev": true }, + "slice-ansi": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", + "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + } + } + }, "snapdragon": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.1.tgz", @@ -8626,6 +9503,12 @@ "get-stdin": "4.0.1" } }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, "supports-color": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", @@ -8655,6 +9538,53 @@ "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.1.0.tgz", "integrity": "sha512-dQoid9tqQ+uotGhuTKEY11X4xhyYePVnqGSoSm3OGKh2E8LZ6RPULp1uXTctk33IeERlrRJYoVSBglsL05F5Uw==" }, + "table": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", + "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", + "dev": true, + "requires": { + "ajv": "5.5.2", + "ajv-keywords": "2.1.1", + "chalk": "2.3.0", + "lodash": "4.17.4", + "slice-ansi": "1.0.0", + "string-width": "2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + } + } + }, "tapable": { "version": "0.2.8", "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.8.tgz", @@ -8672,6 +9602,12 @@ "inherits": "2.0.3" } }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -8709,6 +9645,15 @@ "setimmediate": "1.0.5" } }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "1.0.2" + } + }, "to-arraybuffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", @@ -8900,6 +9845,15 @@ "dev": true, "optional": true }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "1.1.2" + } + }, "type-is": { "version": "1.6.15", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", @@ -10177,6 +11131,15 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, + "write": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", + "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", + "dev": true, + "requires": { + "mkdirp": "0.5.1" + } + }, "xml-char-classes": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/xml-char-classes/-/xml-char-classes-1.0.0.tgz", diff --git a/package.json b/package.json index 8552b0c..9734884 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,8 @@ "build": "webpack --config webpack.dev.js", "build-prod": "webpack --config webpack.prod.js", "clean": "rm -r node_modules && rm package-lock.json", - "gh-pages": "npm run build-prod && node publish.js" + "gh-pages": "npm run build-prod && node publish.js", + "es": "eslint --init" }, "dependencies": { "@babel/polyfill": "^7.0.0-beta.37", @@ -42,10 +43,16 @@ "@babel/plugin-transform-async-to-generator": "^7.0.0-beta.37", "@babel/preset-es2015": "^7.0.0-beta.37", "@babel/preset-react": "^7.0.0-beta.37", + "babel-eslint": "^8.2.1", "babel-loader": "^8.0.0-beta.0", "clean-webpack-plugin": "^0.1.17", "copy-webpack-plugin": "^4.3.1", "css-loader": "^0.28.8", + "eslint": "^4.15.0", + "eslint-config-airbnb": "^16.1.0", + "eslint-plugin-import": "^2.8.0", + "eslint-plugin-jsx-a11y": "^6.0.3", + "eslint-plugin-react": "^7.5.1", "extract-text-webpack-plugin": "^3.0.2", "gh-pages": "^1.1.0", "html-loader": "^0.5.4", diff --git a/src/js/App.js b/src/js/App.js index 3945ee9..b3ee353 100644 --- a/src/js/App.js +++ b/src/js/App.js @@ -1,43 +1,25 @@ import React from 'react' import { - BrowserRouter, - Switch, - Route, - IndexRoute + BrowserRouter, + Switch, + Route, } from 'react-router-dom' import Menu from 'components/Menu' -import {About, Thread, Subreddit} from 'pages' +import { About, Thread, Subreddit } from 'pages' -class App extends React.Component { - constructor(props) { - super(props) +export default props => ( + + <> + +
+ + + + + +
+ + +) - } - - handleStatusChange(text, image) { - this.setState({ - statusText: text, - statusImage: image - }) - } - - render() { - return ( - - <> - -
- - - - - -
- - - ) - } -} - -export default App \ No newline at end of file diff --git a/src/js/components/Comment.js b/src/js/components/Comment.js index de15c55..27da3fe 100644 --- a/src/js/components/Comment.js +++ b/src/js/components/Comment.js @@ -2,27 +2,36 @@ import React from 'react' import { prettyScore, prettyDate, parse } from 'utils' export default (props) => { - const commentCss = 'comment comment-' + (props.removed ? 'removed' : (props.deleted ? 'deleted' : (props.depth % 2 == 0 ? 'even' : 'odd'))); - const innerHTML = (props.body === '[removed]' && props.removed) ? '

[removed too quickly to be archived]

' : parse(comment.body) - const permalink = `/r/${props.subreddit}/comments/${props.threadID}/_/${props.id}/` + let commentStyle = 'comment comment-' - return ( -
-
- [–] - - {props.author} - {props.deleted && ' (deleted by user)'} - - {prettyScore(props.score)} point{(comment.score !== 1) && 's'} - {prettyDate(props.created_utc)} -
-
- -
- ) -} \ No newline at end of file + if (props.removed) { + commentStyle += 'removed' + } else if (props.deleted) { + commentStyle += 'deleted' + } else { + commentStyle += props.depth % 2 === 0 ? 'even' : 'odd' + } + + const innerHTML = (props.body === '[removed]' && props.removed) ? '

[removed too quickly to be archived]

' : parse(props.body) + const permalink = `/r/${props.subreddit}/comments/${props.threadID}/_/${props.id}/` + + return ( +
+
+ + + {props.author} + {props.deleted && ' (deleted by user)'} + + {prettyScore(props.score)} point{(props.score !== 1) && 's'} + {prettyDate(props.created_utc)} +
+
+ +
+ ) +} diff --git a/src/js/components/CommentSection.js b/src/js/components/CommentSection.js index 0fa0d9d..ed0fa7c 100644 --- a/src/js/components/CommentSection.js +++ b/src/js/components/CommentSection.js @@ -1,9 +1,7 @@ import React from 'react' -export default (props) => { - return ( -
- {props.children} -
- ) -} \ No newline at end of file +export default (props) => ( +
+ {props.children} +
+) diff --git a/src/js/components/Menu.js b/src/js/components/Menu.js index d202c14..2f75010 100644 --- a/src/js/components/Menu.js +++ b/src/js/components/Menu.js @@ -1,20 +1,18 @@ import React from 'react' -import {Link} from 'react-router-dom' +import { Link } from 'react-router-dom' import StatusBox from 'components/StatusBox' -export default (props) => { - return ( -
- - -
- ) -} \ No newline at end of file +export default () => ( +
+ + +
+) diff --git a/src/js/components/StatusBox.js b/src/js/components/StatusBox.js index 7664ad1..90cd20c 100644 --- a/src/js/components/StatusBox.js +++ b/src/js/components/StatusBox.js @@ -1,26 +1,22 @@ import React from 'react' -import {connect} from 'react-redux' -import { setStatusLoading, setStatusSuccess, setStatusError } from 'state' +import { connect } from 'react-redux' -class StatusBox extends React.Component { - render() { - return ( -
- {this.props.text && -

{this.props.text}

} - {this.props.image && - } -
- ) - } +class StatusBox extends React.Component { + render() { + return ( +
+ {this.props.text && +

{this.props.text}

} + {this.props.image && + } +
+ ) + } } -const mapStateToProps = (state) => { - return { - text: state.status.text, - image: state.status.image +const mapStateToProps = state => ({ + text: state.status.text, + image: state.status.image, +}) - } -} - -export default connect(mapStateToProps)(StatusBox) \ No newline at end of file +export default connect(mapStateToProps)(StatusBox) diff --git a/src/js/components/SubredditPagination.js b/src/js/components/SubredditPagination.js index 76c734b..e2942cc 100644 --- a/src/js/components/SubredditPagination.js +++ b/src/js/components/SubredditPagination.js @@ -1,22 +1,24 @@ import React from 'react' export default (props) => { - let pageination = <> + let pageination =
- for(var i = start; i <= end; i++) { - if(currentPage === i) { - pageination += {i} - } else { - pageination += {i} - } - } - return ( - - ) -} \ No newline at end of file + for (let i = props.start; i <= props.end; i++) { + if (props.currentPage === i) { + pageination += {i} + } else { + pageination += {i} + } + } + return ( + + ) +} diff --git a/src/js/components/SubredditSort.js b/src/js/components/SubredditSort.js index 90830a2..83e8469 100644 --- a/src/js/components/SubredditSort.js +++ b/src/js/components/SubredditSort.js @@ -1,22 +1,22 @@ import React from 'react' export default (props) => { - const isSelected = time => props.time == time + const isSelected = time => props.time === time - return ( -
- top post of /r/{subreddit} from: - {/* - - - - - - - - - -
- ) -} \ No newline at end of file + return ( +
+ top post of /r/{props.subreddit} from: + {/* + + + + + + + + + +
+ ) +} diff --git a/src/js/components/ThreadHead.js b/src/js/components/ThreadHead.js index eb0f03f..7a5f238 100644 --- a/src/js/components/ThreadHead.js +++ b/src/js/components/ThreadHead.js @@ -1,62 +1,62 @@ import React from 'react' -import {prettyScore, prettyDate, parse, redditThumbnails} from 'utils' +import { prettyScore, prettyDate, parse, redditThumbnails } from 'utils' export default (props) => { - if(!props.title) { - return
- } + if (!props.title) { + return <> + } - const url = props.url.replace('https://www.reddit.com', '') - const userLink = props.author !== '[deleted]' ? `https://www.reddit.com/user/${props.author}` : '' + const url = props.url.replace('https://www.reddit.com', '') + const userLink = props.author !== '[deleted]' ? `https://www.reddit.com/user/${props.author}` : '' - let thumbnail - const thumbnailWidth = props.thumbnail_width ? props.thumbnail_width * 0.5 : 70 - const thumbnailHeight = props.thumbnail_height ? props.thumbnail_height * 0.5 : 70 + let thumbnail + const thumbnailWidth = props.thumbnail_width ? props.thumbnail_width * 0.5 : 70 + const thumbnailHeight = props.thumbnail_height ? props.thumbnail_height * 0.5 : 70 - if(redditThumbnails.includes(props.thumbnail)) { - thumbnail = - } else if(props.thumbnail !== ''){ - thumbnail = ( - - - - ) - } + if (redditThumbnails.includes(props.thumbnail)) { + thumbnail = + } else if (props.thumbnail !== '') { + thumbnail = ( + + Thumbnail + + ) + } - return ( -
- {props.position && - {props.position}} -
-
-
{prettyScore(props.score)}
-
-
- {thumbnail} -
- {props.title} - {props.link_flair_text && - {props.link_flair_text}} - ({props.domain}) -
- submitted {prettyDate(props.created_utc)} by  - {props.author} -  to /r/{props.subreddit} -
- {props.selftext && -
} - -
-
- ) -} \ No newline at end of file + return ( +
+ {props.position && + {props.position}} +
+
+
{prettyScore(props.score)}
+
+
+ {thumbnail} +
+ {props.title} + {props.link_flair_text && + {props.link_flair_text}} + ({props.domain}) +
+ submitted {prettyDate(props.created_utc)} by  + {props.author} +  to /r/{props.subreddit} +
+ {props.selftext && + +
+ ) +} diff --git a/src/js/components/ThreadInfo.js b/src/js/components/ThreadInfo.js index 751b2e5..8bcace6 100644 --- a/src/js/components/ThreadInfo.js +++ b/src/js/components/ThreadInfo.js @@ -1,12 +1,11 @@ import React from 'react' -export default (props) => { - return ( - <> -
- removed comments: {props.removedComments}/${props.totalComments} ({(100 * removedComments / totalComments).toFixed(1)}%) -
-
sorted by: top
- - ) -} \ No newline at end of file +export default (props) => ( + <> +
+ removed comments: {props.removedComments}/${props.totalComments} + ({ ((100 * props.removedComments) / props.totalComments).toFixed(1) }%) +
+
sorted by: top
+ +) diff --git a/src/js/index.js b/src/js/index.js index 21417f4..f023132 100644 --- a/src/js/index.js +++ b/src/js/index.js @@ -1,19 +1,20 @@ -import '../sass/main.sass' import React from 'react' import ReactDOM from 'react-dom' import { Provider } from 'react-redux' import { store } from 'state' -import App from './App' +import App from 'App' + +import '../sass/main.sass' ReactDOM.render( - - - , - document.getElementById("app") + + + , + document.getElementById('app') ) // import {setStatusLoading} from 'state' // store.dispatch(setStatusLoading('hi')) // import { getThread } from 'reddit' -// getThread('videos', '7q4vxi') \ No newline at end of file +// getThread('videos', '7q4vxi') diff --git a/src/js/pages/About.js b/src/js/pages/About.js index c1721a9..078dc05 100644 --- a/src/js/pages/About.js +++ b/src/js/pages/About.js @@ -1,40 +1,48 @@ import React from 'react' -export default (props) => { - return ( -
-
-

About

-

Display removed (by mods) and deleted (by users) comments/threads from Reddit.

-

- Usage: Drag this bookmarklet - Removeddit - to your bookmark bar and use it to get from reddit to removeddit. -

- Alternatively you can manually replace the reddit in the URL to removeddit. -
- E.g. https://www.removeddit.com/r/TwoXChromosomes/comments/6z1hch/ -

-

- Created by Jesper Wrang and uses Jason Baumgartner service for getting removed comments. -

-

TODO

-
    -
  • Collapsing comments
  • -
  • Get removed selftext of thread
  • -
  • Subreddits!
  • -
  • Maybe for specific users
  • -
-

Links/Contact

-

For feedback and bug reports:

-
    -
  • email: removeddit (at) gmail.com
  • -
  • reddit: /u/JubbeArt
  • -
-

- Code on Github. -

-
-
- ) -} \ No newline at end of file +export default props => ( +
+
+

About

+

+ Display + removed + (by mods) and + deleted + (by users) comments/threads from Reddit. +

+

+ Usage: Drag this bookmarklet + + Removeddit + + to your bookmark bar and use it to get from reddit to removeddit. +

+ Alternatively you can manually replace the reddit in the URL to removeddit. +
+ E.g. https://www.removeddit.com/r/TwoXChromosomes/comments/6z1hch/ +

+

+ Created by + Jesper Wrang and uses + Jason Baumgartner service for getting removed comments. +

+

TODO

+
    +
  • Collapsing comments
  • +
  • Get removed selftext of thread
  • +
  • Subreddits!
  • +
  • Maybe for specific users
  • +
+

Links/Contact

+

For feedback and bug reports:

+
    +
  • email: removeddit (at) gmail.com
  • +
  • reddit: /u/JubbeArt
  • +
+

+ Code on Github. +

+
+
+) diff --git a/src/js/pages/Search.js b/src/js/pages/Search.js index d64d33a..0f6ef4a 100644 --- a/src/js/pages/Search.js +++ b/src/js/pages/Search.js @@ -1,78 +1,78 @@ -// var radioInput = function(name, displayNames, values) { -// var inputs = ""; - -// for(var i = 0, len = displayNames.length; i < len; i++){ -// inputs += ''; -// inputs += ''; -// inputs += ''; -// } -// return inputs; -// }; +// var radioInput = function(name, displayNames, values) { +// var inputs = ""; + +// for(var i = 0, len = displayNames.length; i < len; i++){ +// inputs += ''; +// inputs += ''; +// inputs += ''; +// } +// return inputs; +// }; -// var textInput = function(name){ -// return ''; -// }; +// var textInput = function(name){ +// return ''; +// }; -// var label = function(name, display) { -// return ''; -// }; +// var label = function(name, display) { +// return ''; +// }; -// var inputRow = function(text, input) { -// return '
'+text+''+input+"
"; -// }; +// var inputRow = function(text, input) { +// return '
'+text+''+input+"
"; +// }; -// var selectTime = function() { -// var values = ["hour", "12hour", "day", "week", "month", "6month", "year", "all"]; -// var display = ["past hour", "past 12 hours", "past day", "past week", "past month", "past 6 months", "past year", "all time"]; -// var html = ''; -// for(var i = 0, len = values.length; i < len; i++) { -// html += ''; -// } +// for(var i = 0, len = values.length; i < len; i++) { +// html += ''; +// } -// return html + ""; -// }; +// return html + ""; +// }; -// var select = function(name, display, values){ -// var html = ''; + +// for(var i = 0, len = values.length; i < len; i++) { +// html += ''; +// } -// return html + ""; -// }; +// return html + ""; +// }; // return { -// createSearch: function(){ -// var searchBox = document.createElement("div"); -// searchBox.id = "main-box"; -// searchBox.className = "search-box"; -// /* -// Comments: -// text (body) string -// title (title) string -// subreddit (subreddit) string -// author (author) string -// over_18 (over_18) sfw,nsfw,both * -// locked (locked) bool * -// between (after/before) "date" -// sort (sort) asc,desc -// */ -// var html = inputRow('Im looking for: ', radioInput("thread", ["Thread","Comment"], ["true", "false"])); -// html += inputRow(label("text", "Text"), textInput("text")); -// html += inputRow(label("title","Title"), textInput("title")); -// html += inputRow(label("subreddit", "Subreddit"), textInput("subreddit")); -// html += inputRow(label("author", "Author"), textInput("author")); -// html += inputRow("Over 18: ", radioInput("over_18", ["Both","NSFW","SFW"], ["both","nsfw","sfw"])); -// html += inputRow("Locked: ", radioInput("locked", ["Both","True", "False"], ["both","true","false"])); -// html += inputRow("Removed: ", select("removed", ["Removed and non-removed", "Only removed", "Only deleted"], ["all", "removed", "deleted"])); -// html += inputRow("From:", selectTime()); -// html += inputRow("Sort: ", select("sort", ["Highest score","Lowest score","Newest","Oldest"], ["score_desc","score_asc","time_desc","time_asc"])); -// html += ''; -// html += ''; -// searchBox.innerHTML = html; - -// mainDiv.appendChild(searchBox); \ No newline at end of file +// createSearch: function(){ +// var searchBox = document.createElement("div"); +// searchBox.id = "main-box"; +// searchBox.className = "search-box"; +// /* +// Comments: +// text (body) string +// title (title) string +// subreddit (subreddit) string +// author (author) string +// over_18 (over_18) sfw,nsfw,both * +// locked (locked) bool * +// between (after/before) "date" +// sort (sort) asc,desc +// */ +// var html = inputRow('Im looking for: ', radioInput("thread", ["Thread","Comment"], ["true", "false"])); +// html += inputRow(label("text", "Text"), textInput("text")); +// html += inputRow(label("title","Title"), textInput("title")); +// html += inputRow(label("subreddit", "Subreddit"), textInput("subreddit")); +// html += inputRow(label("author", "Author"), textInput("author")); +// html += inputRow("Over 18: ", radioInput("over_18", ["Both","NSFW","SFW"], ["both","nsfw","sfw"])); +// html += inputRow("Locked: ", radioInput("locked", ["Both","True", "False"], ["both","true","false"])); +// html += inputRow("Removed: ", select("removed", ["Removed and non-removed", "Only removed", "Only deleted"], ["all", "removed", "deleted"])); +// html += inputRow("From:", selectTime()); +// html += inputRow("Sort: ", select("sort", ["Highest score","Lowest score","Newest","Oldest"], ["score_desc","score_asc","time_desc","time_asc"])); +// html += ''; +// html += ''; +// searchBox.innerHTML = html; + +// mainDiv.appendChild(searchBox); \ No newline at end of file diff --git a/src/js/pages/Subreddit.js b/src/js/pages/Subreddit.js index 76efb05..b357c42 100644 --- a/src/js/pages/Subreddit.js +++ b/src/js/pages/Subreddit.js @@ -1,8 +1,14 @@ import React from 'react' export default class Subreddit extends React.Component { - render() { - return

Subreddit

- } + constructor(props) { + super(props) -} \ No newline at end of file + this.state = { + + } + } + render() { + return

Subreddit

+ } +} diff --git a/src/js/pages/Thread.js b/src/js/pages/Thread.js index d0fabbf..d771f9a 100644 --- a/src/js/pages/Thread.js +++ b/src/js/pages/Thread.js @@ -3,32 +3,31 @@ import ThreadHead from 'components/ThreadHead' import { getThread } from 'reddit' export default class Thread extends React.Component { - constructor(props) { - super(props) + constructor(props) { + super(props) - this.state = { - thread: {} - } - } + this.state = { + thread: {}, + } + } - componentDidMount() { - getThread(this.props.match.params.subreddit, this.props.match.params.threadID) - .then(thread => { - this.setState({thread}) - - // check if thread is deleted - //if(thread.) - return thread - }) - - } + componentDidMount() { + getThread(this.props.match.params.subreddit, this.props.match.params.threadID) + .then(thread => { + this.setState({ thread }) - render () { - return ( - <> - -

lol

- - ) - } -} \ No newline at end of file + // check if thread is deleted + // if(thread.) + return thread + }) + } + + render() { + return ( + <> + +

lol

+ + ) + } +} diff --git a/src/js/pages/index.js b/src/js/pages/index.js index 99a7260..80d8edf 100644 --- a/src/js/pages/index.js +++ b/src/js/pages/index.js @@ -1,3 +1,3 @@ -export {default as About} from './About' -export {default as Subreddit} from './Subreddit' -export {default as Thread} from './Thread' \ No newline at end of file +export { default as About } from './About' +export { default as Subreddit } from './Subreddit' +export { default as Thread } from './Thread' diff --git a/src/js/pushshift/index.js b/src/js/pushshift/index.js index db13cdd..86ea422 100644 --- a/src/js/pushshift/index.js +++ b/src/js/pushshift/index.js @@ -1,37 +1,38 @@ -const baseURL = 'https://elastic.pushshift.io' -const submissionURL = baseURL + '/rs/submissions/_search?source=' -const commentURL = baseURL + '/rc/comments/_search?source=' -const commentIDsURL = 'https://api.pushshift.io/reddit/submission/comment_ids/' - import { json, toBase10, toBase36 } from 'utils' -export const getCommentIDs = threadID => { - return fetch(commentIDsURL + threadID) - .then(json) - .then(results => { - return results.data - }) -} +const baseURL = 'https://elastic.pushshift.io' +const submissionURL = `${baseURL}/rs/submissions/_search?source=` +const commentURL = `${baseURL}/rc/comments/_search?source=` +const commentIDsURL = 'https://api.pushshift.io/reddit/submission/comment_ids/' + + +export const getCommentIDs = threadID => ( + fetch(commentIDsURL + threadID) + .then(json) + .then(results => results.data) +) export const test = threadID => { - const elasticQuery = { - query: { - term: { - link_id: toBase10(threadID) - } - }, - size: 10000, - } + const elasticQuery = { + query: { + term: { + link_id: toBase10(threadID), + }, + }, + size: 10000, + } - return fetch(commentURL + JSON.stringify(elasticQuery)) - .then(json) - .then(results => { - results.hits.hits.map(result => { - result._source.link_id = toBase36(result._source.link_id ) - result._source.parent_id = toBase36(result._source.parent_id) - result._source.id = toBase36(result._id) + return ( + fetch(commentURL + JSON.stringify(elasticQuery)) + .then(json) + .then(results => { + results.hits.hits.map(result => { + result._source.link_id = toBase36(result._source.link_id) + result._source.parent_id = toBase36(result._source.parent_id) + result._source.id = toBase36(result._id) - return result._source - }) - }) -} \ No newline at end of file + return result._source + }) + }) + ) +} diff --git a/src/js/reddit/clientID.js b/src/js/reddit/clientID.js index d586a81..44562d6 100644 --- a/src/js/reddit/clientID.js +++ b/src/js/reddit/clientID.js @@ -1,3 +1,3 @@ // Change this to your own client ID: https://www.reddit.com/prefs/apps // The app NEEDS TO BE an installed app and NOT a web apps -export default 'YSidAws9twqCZg' \ No newline at end of file +export default 'YSidAws9twqCZg' diff --git a/src/js/reddit/index.js b/src/js/reddit/index.js index b4cb03c..4cfa197 100644 --- a/src/js/reddit/index.js +++ b/src/js/reddit/index.js @@ -1,14 +1,13 @@ +import { json } from 'utils' import clientID from './clientID' -import {json} from 'utils' - // Reddit API // Headers for general api calls const init = { - headers: { - 'Authorization': '' - } + headers: { + Authorization: '', + }, } let hasToken = false @@ -16,194 +15,195 @@ let baseCommentTree = {} // Headers for getting reddit api token const tokenInit = { - headers: { - 'Authorization': 'Basic ' + btoa(clientID + ':'), - 'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8' - }, - method: 'POST', - body: `grant_type=${encodeURIComponent('https://oauth.reddit.com/grants/installed_client')}&device_id=DO_NOT_TRACK_THIS_DEVICE` + headers: { + Authorization: `Basic ${btoa(clientID + ':')}`, + 'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8', + }, + method: 'POST', + body: `grant_type=${encodeURIComponent('https://oauth.reddit.com/grants/installed_client')}&device_id=DO_NOT_TRACK_THIS_DEVICE` } const fetchToken = () => { - if(hasToken) { - return Promise.resolve() - } + if (hasToken) { + return Promise.resolve() + } - return fetch('https://www.reddit.com/api/v1/access_token', tokenInit) - .then(json) - .then(json => { - init.headers.Authorization = 'bearer ' + json.access_token; - hasToken = true - }) + return ( + fetch('https://www.reddit.com/api/v1/access_token', tokenInit) + .then(json) + .then(jsonData => { + init.headers.Authorization = `bearer ${jsonData.access_token}`; + hasToken = true + }) + ) } -export const getThread = (subreddit, threadID) => { - return fetchToken() - .then(() => fetch(`https://oauth.reddit.com/r/${subreddit}/comments/${threadID}`, init)) - .then(json) - .then(results => { - // Save the comments for later - baseCommentTree = results[1].data.children +export const getThread = (subreddit, threadID) => ( + fetchToken() + .then(() => fetch(`https://oauth.reddit.com/r/${subreddit}/comments/${threadID}`, init)) + .then(json) + .then(results => { + // Save the comments for later + baseCommentTree = results[1].data.children - // Return the thread - return results[0].data.children[0].data - }) -} + // Return the thread + return results[0].data.children[0].data + }) +) export const getCommentIDs = () => { - } -// HandleIDs.normal(thread); -// return HandleIDs.morechildren() -// .catch(function(error){ -// return Promise.reject("Could not get comments from Reddit (moreChildren)"); -// }); -// }) -// .then(function(){ -// return Promise.all(_.map(_.uniq(Comments.countinuethread), function(id) { -// return fetch(URLs.thread+"/_/"+id.split("_")[1], Reddit.init) -// .then(Fetch2.json) -// .catch(function(error){ return Promise.reject("Could not get comments from Reddit (continueThisThread)") }) -// })) -// .catch(function(error){ -// return Promise.reject("Could not get comments from Reddit (continueThisThread)"); -// }); -// }) -// .then(function(smallerThreads){ -// _.forEach(smallerThreads, function(thread){ -// HandleIDs.normal(thread); -// }) -// Status.loading("Getting removed comments..."); -// HandleIDs.removed(); -// ThreadHTML.createCommentInfo(Comments.removed.length); -// return Fetch2.multiple(URLs.format(URLs.pushshiftComments, Comments.removed), null, "data") -// .catch(function(error){ -// return Promise.reject("Could not get removed comments"); -// }); -// }) -// .then(function(removedComments){ -// Status.loading("Generating comments..."); -// return Comments.generate(removedComments); -// }) -// .then(function(){ -// Status.success(); -// }) -// .catch(function(error) { -// if(_.includes(_.toLower(error), "error")) { -// Status.error(error); -// } else { -// Status.error("Error: "+error); -// } -// }); -// } +// HandleIDs.normal(thread); +// return HandleIDs.morechildren() +// .catch(function(error){ +// return Promise.reject("Could not get comments from Reddit (moreChildren)"); +// }); +// }) +// .then(function(){ +// return Promise.all(_.map(_.uniq(Comments.countinuethread), function(id) { +// return fetch(URLs.thread+"/_/"+id.split("_")[1], Reddit.init) +// .then(Fetch2.json) +// .catch(function(error){ return Promise.reject("Could not get comments from Reddit (continueThisThread)") }) +// })) +// .catch(function(error){ +// return Promise.reject("Could not get comments from Reddit (continueThisThread)"); +// }); +// }) +// .then(function(smallerThreads){ +// _.forEach(smallerThreads, function(thread){ +// HandleIDs.normal(thread); +// }) +// Status.loading("Getting removed comments..."); +// HandleIDs.removed(); +// ThreadHTML.createCommentInfo(Comments.removed.length); +// return Fetch2.multiple(URLs.format(URLs.pushshiftComments, Comments.removed), null, "data") +// .catch(function(error){ +// return Promise.reject("Could not get removed comments"); +// }); +// }) +// .then(function(removedComments){ +// Status.loading("Generating comments..."); +// return Comments.generate(removedComments); +// }) +// .then(function(){ +// Status.success(); +// }) +// .catch(function(error) { +// if(_.includes(_.toLower(error), "error")) { +// Status.error(error); +// } else { +// Status.error("Error: "+error); +// } +// }); +// } // }})(); // // ------------------------------------------------------------------------------ // // ----------------------- Store and genrates comments -------------------------- // // ------------------------------------------------------------------------------ // var Comments = (function() { -// var totalComments; -// var lookup = {}; -// var toBeCreated = []; +// var totalComments; +// var lookup = {}; +// var toBeCreated = []; -// var getParentComments = function(toLookup){ -// var newCommentsToLookup = []; -// var commentsToFetch = []; +// var getParentComments = function(toLookup){ +// var newCommentsToLookup = []; +// var commentsToFetch = []; -// _.forEach(toLookup, function(id){ -// var parentID = lookup[id].parent_id.split("_")[1]; - -// if(parentID === Reddit.threadID) {} // Has no parent (is parent of thread) -// else if(_.includes(Comments.toBeCreated, parentID)) {} // Parent already exists, do nothing -// else if(_.includes(newCommentsToLookup, parentID)) {} // Parent already exists (this iteration) -// else if(_.has(lookup, parentID)) { -// newCommentsToLookup.push(parentID); -// } else{ -// commentsToFetch.push(parentID); -// } - -// Comments.toBeCreated.push(id); -// }); - -// return new Promise(function(resolve, reject){ -// if(_.uniq(commentsToFetch).length !== 0) { -// fetch(URLs.singleComments + _.join(_.map(_.uniq(commentsToFetch),function(comments){ -// return "t1_" + comments; -// })), Reddit.init) -// .then(Fetch2.json) -// .then(function(json){ -// _.forEach(json.data.children, function(comment) { -// lookup[comment.data.id] = comment.data; -// newCommentsToLookup.push(comment.data.id); -// }); -// }) -// .then(function(){ -// resolve(); -// }); - -// } else { -// resolve(); -// } -// }) -// .then(function(){ -// if(newCommentsToLookup.length !== 0) { -// return getParentComments(newCommentsToLookup) -// } -// }); - -// }; +// _.forEach(toLookup, function(id){ +// var parentID = lookup[id].parent_id.split("_")[1]; + +// if(parentID === Reddit.threadID) {} // Has no parent (is parent of thread) +// else if(_.includes(Comments.toBeCreated, parentID)) {} // Parent already exists, do nothing +// else if(_.includes(newCommentsToLookup, parentID)) {} // Parent already exists (this iteration) +// else if(_.has(lookup, parentID)) { +// newCommentsToLookup.push(parentID); +// } else{ +// commentsToFetch.push(parentID); +// } + +// Comments.toBeCreated.push(id); +// }); + +// return new Promise(function(resolve, reject){ +// if(_.uniq(commentsToFetch).length !== 0) { +// fetch(URLs.singleComments + _.join(_.map(_.uniq(commentsToFetch),function(comments){ +// return "t1_" + comments; +// })), Reddit.init) +// .then(Fetch2.json) +// .then(function(json){ +// _.forEach(json.data.children, function(comment) { +// lookup[comment.data.id] = comment.data; +// newCommentsToLookup.push(comment.data.id); +// }); +// }) +// .then(function(){ +// resolve(); +// }); + +// } else { +// resolve(); +// } +// }) +// .then(function(){ +// if(newCommentsToLookup.length !== 0) { +// return getParentComments(newCommentsToLookup) +// } +// }); + +// }; // return { -// ids: [], // The comments we found -// morechildren: [], -// countinuethread: [], - -// allIDs: [], // All the comments that we were suppose to find -// removed: [], -// deleted: [], -// toBeCreated: toBeCreated, -// lookup: lookup, +// ids: [], // The comments we found +// morechildren: [], +// countinuethread: [], + +// allIDs: [], // All the comments that we were suppose to find +// removed: [], +// deleted: [], +// toBeCreated: toBeCreated, +// lookup: lookup, -// getTotalComments: function() { return totalComments; }, -// setTotalComments: function(total) { totalComments = total; }, +// getTotalComments: function() { return totalComments; }, +// setTotalComments: function(total) { totalComments = total; }, -// getRoot: function() { -// if(Reddit.permalink !== undefined && Reddit.permalink === "") { -// return Reddit.threadID; -// } +// getRoot: function() { +// if(Reddit.permalink !== undefined && Reddit.permalink === "") { +// return Reddit.threadID; +// } -// if(Reddit.permalink === undefined) { -// return Reddit.threadID; -// } +// if(Reddit.permalink === undefined) { +// return Reddit.threadID; +// } -// if(_.has(Comments.lookup, Reddit.permalink)) { -// return Comments.lookup[Reddit.permalink].parent_id.split("_")[1]; -// } -// return ""; -// }, -// generate: function(removedComments) { -// removedComments.forEach(function(comment){ -// if(_.includes(Comments.deleted, comment.id)) { -// comment["deleted"] = true; -// } else { -// comment["removed"] = true; -// } - -// Comments.lookup[comment.id] = comment; -// }); - -// Comments.removed = _.map(removedComments, function(comment){ -// return comment.id; -// }); - -// return getParentComments(Comments.removed) -// .then(function(){ -// ThreadHTML.createCommentSection(); -// ThreadHTML.createComments(); -// }) -// } +// if(_.has(Comments.lookup, Reddit.permalink)) { +// return Comments.lookup[Reddit.permalink].parent_id.split("_")[1]; +// } +// return ""; +// }, +// generate: function(removedComments) { +// removedComments.forEach(function(comment){ +// if(_.includes(Comments.deleted, comment.id)) { +// comment["deleted"] = true; +// } else { +// comment["removed"] = true; +// } + +// Comments.lookup[comment.id] = comment; +// }); + +// Comments.removed = _.map(removedComments, function(comment){ +// return comment.id; +// }); + +// return getParentComments(Comments.removed) +// .then(function(){ +// ThreadHTML.createCommentSection(); +// ThreadHTML.createComments(); +// }) +// } // }})(); @@ -212,54 +212,54 @@ export const getCommentIDs = () => { // // ----------------- Handle comments from different requests -------------------- // // ------------------------------------------------------------------------------ // var HandleIDs = (function(){ -// var normal = function(thread){ -// return _.flatten(_.map(thread[1].data.children, Extract.normal)) -// }; +// var normal = function(thread){ +// return _.flatten(_.map(thread[1].data.children, Extract.normal)) +// }; -// var morechildren = function(){ -// return Promise.all(_.map(_.uniq(Comments.morechildren), function(idArray){ -// return Fetch2.multiple(URLs.format(URLs.moreChildren, idArray), Reddit.init); -// })) -// .then(function(responseArrays){ -// Comments.morechildren.length = 0; -// _.forEach(responseArrays, function(responseArray){ -// _.forEach(responseArray, function(response){ -// _.forEach(response.jquery[10][3][0], function(comment){ -// Extract.normal(comment); -// }) -// }); -// }); -// }).then(function(){ -// if(Comments.morechildren.length !== 0) { -// return morechildren(); -// } -// }); -// }; +// var morechildren = function(){ +// return Promise.all(_.map(_.uniq(Comments.morechildren), function(idArray){ +// return Fetch2.multiple(URLs.format(URLs.moreChildren, idArray), Reddit.init); +// })) +// .then(function(responseArrays){ +// Comments.morechildren.length = 0; +// _.forEach(responseArrays, function(responseArray){ +// _.forEach(responseArray, function(response){ +// _.forEach(response.jquery[10][3][0], function(comment){ +// Extract.normal(comment); +// }) +// }); +// }); +// }).then(function(){ +// if(Comments.morechildren.length !== 0) { +// return morechildren(); +// } +// }); +// }; -// var removed = function(){ -// Comments.removed = _.difference(Comments.allIDs, Comments.ids); +// var removed = function(){ +// Comments.removed = _.difference(Comments.allIDs, Comments.ids); -// Comments.ids.forEach(function(id){ -// if(! _.has(Comments.lookup, id)) { -// return; -// } - -// if(Comments.lookup[id].body === "[removed]") { -// Comments.removed.push(id); -// } else if (Comments.lookup[id].body === "[deleted]"){ -// Comments.removed.push(id); -// Comments.deleted.push(id); -// } -// }); +// Comments.ids.forEach(function(id){ +// if(! _.has(Comments.lookup, id)) { +// return; +// } + +// if(Comments.lookup[id].body === "[removed]") { +// Comments.removed.push(id); +// } else if (Comments.lookup[id].body === "[deleted]"){ +// Comments.removed.push(id); +// Comments.deleted.push(id); +// } +// }); -// Comments.removed = _.uniq(Comments.removed); -// }; +// Comments.removed = _.uniq(Comments.removed); +// }; -// return { -// normal: normal, -// morechildren: morechildren, -// removed: removed -// }; +// return { +// normal: normal, +// morechildren: morechildren, +// removed: removed +// }; // })(); @@ -267,32 +267,32 @@ export const getCommentIDs = () => { // // ----------------------- Extract ID from comments ----------------------------- // // ------------------------------------------------------------------------------ // var Extract = (function(){ -// var normal = function(comment){ -// var data = comment.data; - -// if(comment.kind == "more") { // "Show more"-comment -// if(data.id === "_") { // = "continue this thread" comment -// Comments.countinuethread.push(data.parent_id); -// } else if(data.children.length < data.count){ // "Load more"-comment (that is missing some of its children) -// Comments.morechildren.push(data.children); -// } -// Comments.ids.push.apply(Comments.ids, data.children); -// } else { // Normal comment -// if(data.replies) { -// data.replies.data.children.forEach(function(child){ -// normal(child); -// }); -// delete data.replies; -// } - -// Comments.ids.push(data.id); -// Comments.lookup[data.id] = data; -// } -// }; - -// return { -// normal: normal -// }; +// var normal = function(comment){ +// var data = comment.data; + +// if(comment.kind == "more") { // "Show more"-comment +// if(data.id === "_") { // = "continue this thread" comment +// Comments.countinuethread.push(data.parent_id); +// } else if(data.children.length < data.count){ // "Load more"-comment (that is missing some of its children) +// Comments.morechildren.push(data.children); +// } +// Comments.ids.push.apply(Comments.ids, data.children); +// } else { // Normal comment +// if(data.replies) { +// data.replies.data.children.forEach(function(child){ +// normal(child); +// }); +// delete data.replies; +// } + +// Comments.ids.push(data.id); +// Comments.lookup[data.id] = data; +// } +// }; + +// return { +// normal: normal +// }; // })(); @@ -300,37 +300,37 @@ export const getCommentIDs = () => { // // ---------------------------- Generating HTML --------------------------------- // // ------------------------------------------------------------------------------ - -// var createComments = function(){ -// var commentsToCreate = _.sortBy(_.uniq(Comments.toBeCreated), function(id) { -// return Comments.lookup[id].score; -// }); + +// var createComments = function(){ +// var commentsToCreate = _.sortBy(_.uniq(Comments.toBeCreated), function(id) { +// return Comments.lookup[id].score; +// }); -// var createdComments = [Comments.getRoot()]; -// var didSomething = false; - -// while(commentsToCreate.length > 0) { -// didSomething = false; - -// for(var i = commentsToCreate.length - 1; i >= 0; i--) { -// var id = commentsToCreate[i]; -// var parentID = Comments.lookup[id].parent_id.split("_")[1]; - -// if(_.includes(createdComments, parentID)) { -// document.getElementById(parentID).appendChild(createComment(Comments.lookup[id])); -// createdComments.push(id); -// commentsToCreate.splice(i, 1); -// didSomething = true; -// } -// } - -// // Fail safe (parents missing for the rest of the comments, shouldn't happend but oh well :D) -// if(!didSomething) { -// console.error("Didn't generate all comments correctly"); -// break; -// } -// } -// }; +// var createdComments = [Comments.getRoot()]; +// var didSomething = false; + +// while(commentsToCreate.length > 0) { +// didSomething = false; + +// for(var i = commentsToCreate.length - 1; i >= 0; i--) { +// var id = commentsToCreate[i]; +// var parentID = Comments.lookup[id].parent_id.split("_")[1]; + +// if(_.includes(createdComments, parentID)) { +// document.getElementById(parentID).appendChild(createComment(Comments.lookup[id])); +// createdComments.push(id); +// commentsToCreate.splice(i, 1); +// didSomething = true; +// } +// } + +// // Fail safe (parents missing for the rest of the comments, shouldn't happend but oh well :D) +// if(!didSomething) { +// console.error("Didn't generate all comments correctly"); +// break; +// } +// } +// }; - \ No newline at end of file + \ No newline at end of file diff --git a/src/js/state/index.js b/src/js/state/index.js index 67b5930..2330ea6 100644 --- a/src/js/state/index.js +++ b/src/js/state/index.js @@ -1,13 +1,11 @@ import { createStore, combineReducers, applyMiddleware } from 'redux' import logger from 'redux-logger' - import { statusReducer } from './status' + export { setStatusLoading, setStatusSuccess, setStatusError } from './status' const reducer = combineReducers({ - status: statusReducer + status: statusReducer, }) - - -export const store = createStore(reducer, applyMiddleware(logger)) \ No newline at end of file +export const store = createStore(reducer, applyMiddleware(logger)) diff --git a/src/js/state/status.js b/src/js/state/status.js index 2de0152..3408c62 100644 --- a/src/js/state/status.js +++ b/src/js/state/status.js @@ -1,7 +1,7 @@ const images = { - loading: '/images/loading.gif', - error: '/images/error.png', - success: '/images/done.png' + loading: '/images/loading.gif', + error: '/images/error.png', + success: '/images/done.png', } // Action types @@ -10,45 +10,37 @@ const STATUS_SET_SUCCESS = 'STATUS_SET_SUCCESS' const STATUS_SET_ERROR = 'STATUS_SET_ERROR' // Action creators -export const setStatusLoading = (payload = '') => { - return {type: STATUS_SET_LOADING, payload} -} - -export const setStatusSuccess = (payload = '') => { - return {type: STATUS_SET_SUCCESS, payload} -} - -export const setStatusError = (payload = '') => { - return {type: STATUS_SET_ERROR, payload} -} +export const setStatusLoading = (payload = '') => ({ type: STATUS_SET_LOADING, payload }) +export const setStatusSuccess = (payload = '') => ({ type: STATUS_SET_SUCCESS, payload }) +export const setStatusError = (payload = '') => ({ type: STATUS_SET_ERROR, payload }) // Init state const initialStatusState = { - text: null, - image: null + text: null, + image: null, } export const statusReducer = (state = initialStatusState, action) => { - switch (action.type) { - case STATUS_SET_SUCCESS: - return { - ...state, - text: action.payload, - image: images.success - } - case STATUS_SET_LOADING: - return { - ...state, - text: action.payload, - image: images.loading - } - case STATUS_SET_ERROR: - return { - ...state, - text: action.payload, - image: images.error - } - default: - return state - } -} \ No newline at end of file + switch (action.type) { + case STATUS_SET_SUCCESS: + return { + ...state, + text: action.payload, + image: images.success, + } + case STATUS_SET_LOADING: + return { + ...state, + text: action.payload, + image: images.loading, + } + case STATUS_SET_ERROR: + return { + ...state, + text: action.payload, + image: images.error, + } + default: + return state + } +} diff --git a/src/js/utils/index.js b/src/js/utils/index.js index cf473a9..251703e 100644 --- a/src/js/utils/index.js +++ b/src/js/utils/index.js @@ -3,7 +3,7 @@ import SnuOwnd from 'libraries/snuownd.js' const markdown = SnuOwnd.getParser() // Change bases -export const toBase36 = number => parseInt(number).toString(36) +export const toBase36 = number => parseInt(number, 10).toString(36) export const toBase10 = numberString => parseInt(numberString, 36) // Default thumbnails for reddit threads @@ -17,32 +17,32 @@ export const parse = text => markdown.render(text) // UTC -> "Reddit time format" (e.g. 5 hours ago, just now, etc...) export const prettyDate = createdUTC => { - const currentUTC = Math.floor((new Date()).getTime() / 1000) - const secondDiff = currentUTC - createdUTC - const dayDiff = Math.floor(secondDiff / 86400) - - if(dayDiff < 0) return "" - if(dayDiff == 0) { - if(secondDiff < 10) return "just now" - if(secondDiff < 60) return secondDiff + " seconds ago" - if(secondDiff < 120) return "a minute ago" - if(secondDiff < 3600) return Math.floor(secondDiff / 60) + " minutes ago" - if(secondDiff < 7200) return "an hour ago" - if(secondDiff < 86400) return Math.floor(secondDiff / 3600) + " hours ago" - } - if(dayDiff < 7) return dayDiff + " days ago" - if(dayDiff < 31) return Math.floor(dayDiff / 7) + " weeks ago" - if(dayDiff < 365) return Math.floor(dayDiff / 30) + " months ago" - return Math.floor(dayDiff / 365) + " years ago" + const currentUTC = Math.floor((new Date()).getTime() / 1000) + const secondDiff = currentUTC - createdUTC + const dayDiff = Math.floor(secondDiff / 86400) + + if (dayDiff < 0) return '' + if (dayDiff === 0) { + if (secondDiff < 10) return 'just now' + if (secondDiff < 60) return `${secondDiff} seconds ago` + if (secondDiff < 120) return 'a minute ago' + if (secondDiff < 3600) return `${Math.floor(secondDiff / 60)} minutes ago` + if (secondDiff < 7200) return 'an hour ago' + if (secondDiff < 86400) return `${Math.floor(secondDiff / 3600)} hours ago` + } + if (dayDiff < 7) return `${dayDiff} days ago` + if (dayDiff < 31) return `${Math.floor(dayDiff / 7)} weeks ago` + if (dayDiff < 365) return `${Math.floor(dayDiff / 30)} months ago` + return `${Math.floor(dayDiff / 365)} years ago` } // Reddit format for scores, e.g. 12000 => 12k export const prettyScore = score => { - if(score >= 100000) { - return (score / 1000).toFixed(0) + "k" - } else if(score >= 10000) { - return (score / 1000).toFixed(1) + "k" - } + if (score >= 100000) { + return `${(score / 1000).toFixed(0)}k` + } else if (score >= 10000) { + return `${(score / 1000).toFixed(1)}k` + } - return score -} \ No newline at end of file + return score +}