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 (
-
- )
-}
\ 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 (
+
+ )
+}
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 = (
+
+
+
+ )
+ }
- return (
-
- {props.position &&
-
{props.position}}
-
-
-
{prettyScore(props.score)}
-
-
- {thumbnail}
-
-
{props.title}
- {props.link_flair_text &&
-
{props.link_flair_text}}
-
({props.domain})
-
- {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})
+
+ {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 (
- <>
-
-
- >
- )
-}
\ No newline at end of file
+export default (props) => (
+ <>
+
+
+ >
+)
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 = '';
+// 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 += '';
-// }
+// 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
+}