From 37bf019410238327cc906a5c9dc5048fb4ca0936 Mon Sep 17 00:00:00 2001 From: Matt Crowder Date: Wed, 20 Mar 2019 22:11:48 -0400 Subject: [PATCH 1/9] extras --- .babelrc.js | 1 + package-lock.json | 442 +++++++++++++++++++++++++++- package.json | 5 +- src/__tests__/compose.test.js | 16 + src/__tests__/default-value.test.js | 11 + src/__tests__/loader-button.test.js | 13 + src/__tests__/loader-card.test.js | 13 + src/__tests__/login.test.js | 7 + src/compose.js | 12 + src/default-value.js | 10 + src/loader-button.js | 40 +++ src/loader-card.js | 18 ++ src/login.js | 71 +++++ test/test-utils.js | 10 + 14 files changed, 665 insertions(+), 4 deletions(-) create mode 100644 src/__tests__/compose.test.js create mode 100644 src/__tests__/default-value.test.js create mode 100644 src/__tests__/loader-button.test.js create mode 100644 src/__tests__/loader-card.test.js create mode 100644 src/__tests__/login.test.js create mode 100644 src/compose.js create mode 100644 src/default-value.js create mode 100644 src/loader-button.js create mode 100644 src/loader-card.js create mode 100644 src/login.js create mode 100644 test/test-utils.js diff --git a/.babelrc.js b/.babelrc.js index 592da39..b90a65b 100644 --- a/.babelrc.js +++ b/.babelrc.js @@ -1,3 +1,4 @@ module.exports = { presets: ["@babel/env", "@babel/preset-react"], + plugins: ["@babel/plugin-proposal-class-properties"], }; diff --git a/package-lock.json b/package-lock.json index 5b14073..07303a6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -123,6 +123,20 @@ "@babel/types": "^7.4.0" } }, + "@babel/helper-create-class-features-plugin": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.4.0.tgz", + "integrity": "sha512-2K8NohdOT7P6Vyp23QH4w2IleP8yG3UJsbRKwA4YP6H8fErcLkFuuEEqbF2/BYBKSNci/FWJiqm6R3VhM/QHgw==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-member-expression-to-functions": "^7.0.0", + "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.4.0", + "@babel/helper-split-export-declaration": "^7.4.0" + } + }, "@babel/helper-define-map": { "version": "7.4.0", "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.4.0.tgz", @@ -324,6 +338,16 @@ "@babel/plugin-syntax-async-generators": "^7.2.0" } }, + "@babel/plugin-proposal-class-properties": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.4.0.tgz", + "integrity": "sha512-t2ECPNOXsIeK1JxJNKmgbzQtoG27KIlVE61vTqX0DKR9E9sZlVVxWUtEW9D5FlZ8b8j7SBNCHY47GgPKCKlpPg==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.4.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, "@babel/plugin-proposal-json-strings": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz", @@ -1085,6 +1109,64 @@ "@types/yargs": "^12.0.9" } }, + "@material-ui/core": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-3.9.2.tgz", + "integrity": "sha512-aukR3mSH3g115St2OnqoeMRtmxzxxx+Mch7pFKRV3Tz3URExBlZwOolimjxKZpG4LGec8HlhREawafLsDzjVWQ==", + "dev": true, + "requires": { + "@babel/runtime": "^7.2.0", + "@material-ui/system": "^3.0.0-alpha.0", + "@material-ui/utils": "^3.0.0-alpha.2", + "@types/jss": "^9.5.6", + "@types/react-transition-group": "^2.0.8", + "brcast": "^3.0.1", + "classnames": "^2.2.5", + "csstype": "^2.5.2", + "debounce": "^1.1.0", + "deepmerge": "^3.0.0", + "dom-helpers": "^3.2.1", + "hoist-non-react-statics": "^3.2.1", + "is-plain-object": "^2.0.4", + "jss": "^9.8.7", + "jss-camel-case": "^6.0.0", + "jss-default-unit": "^8.0.2", + "jss-global": "^3.0.0", + "jss-nested": "^6.0.1", + "jss-props-sort": "^6.0.0", + "jss-vendor-prefixer": "^7.0.0", + "normalize-scroll-left": "^0.1.2", + "popper.js": "^1.14.1", + "prop-types": "^15.6.0", + "react-event-listener": "^0.6.2", + "react-transition-group": "^2.2.1", + "recompose": "0.28.0 - 0.30.0", + "warning": "^4.0.1" + } + }, + "@material-ui/system": { + "version": "3.0.0-alpha.2", + "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-3.0.0-alpha.2.tgz", + "integrity": "sha512-odmxQ0peKpP7RQBQ8koly06YhsPzcoVib1vByVPBH4QhwqBXuYoqlCjt02846fYspAqkrWzjxnWUD311EBbxOA==", + "dev": true, + "requires": { + "@babel/runtime": "^7.2.0", + "deepmerge": "^3.0.0", + "prop-types": "^15.6.0", + "warning": "^4.0.1" + } + }, + "@material-ui/utils": { + "version": "3.0.0-alpha.3", + "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-3.0.0-alpha.3.tgz", + "integrity": "sha512-rwMdMZptX0DivkqBuC+Jdq7BYTXwqKai5G5ejPpuEDKpWzi1Oxp+LygGw329FrKpuKeiqpcymlqJTjmy+quWng==", + "dev": true, + "requires": { + "@babel/runtime": "^7.2.0", + "prop-types": "^15.6.0", + "react-is": "^16.6.3" + } + }, "@sheerun/mutationobserver-shim": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/@sheerun/mutationobserver-shim/-/mutationobserver-shim-0.3.2.tgz", @@ -1138,12 +1220,47 @@ "integrity": "sha512-ohkhb9LehJy+PA40rDtGAji61NCgdtKLAlFoYp4cnuuQEswwdK3vz9SOIkkyc3wrk8dzjphQApNs56yyXLStaQ==", "dev": true }, + "@types/jss": { + "version": "9.5.8", + "resolved": "https://registry.npmjs.org/@types/jss/-/jss-9.5.8.tgz", + "integrity": "sha512-bBbHvjhm42UKki+wZpR89j73ykSXg99/bhuKuYYePtpma3ZAnmeGnl0WxXiZhPGsIfzKwCUkpPC0jlrVMBfRxA==", + "dev": true, + "requires": { + "csstype": "^2.0.0", + "indefinite-observable": "^1.0.1" + } + }, "@types/node": { "version": "11.11.4", "resolved": "https://registry.npmjs.org/@types/node/-/node-11.11.4.tgz", "integrity": "sha512-02tIL+QIi/RW4E5xILdoAMjeJ9kYq5t5S2vciUdFPXv/ikFTb0zK8q9vXkg4+WAJuYXGiVT1H28AkD2C+IkXVw==", "dev": true }, + "@types/prop-types": { + "version": "15.7.0", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.0.tgz", + "integrity": "sha512-eItQyV43bj4rR3JPV0Skpl1SncRCdziTEK9/v8VwXmV6d/qOUO8/EuWeHBbCZcsfSHfzI5UyMJLCSXtxxznyZg==", + "dev": true + }, + "@types/react": { + "version": "16.8.8", + "resolved": "https://registry.npmjs.org/@types/react/-/react-16.8.8.tgz", + "integrity": "sha512-xwEvyet96u7WnB96kqY0yY7qxx/pEpU51QeACkKFtrgjjXITQn0oO1iwPEraXVgh10ZFPix7gs1R4OJXF7P5sg==", + "dev": true, + "requires": { + "@types/prop-types": "*", + "csstype": "^2.2.0" + } + }, + "@types/react-transition-group": { + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-2.0.16.tgz", + "integrity": "sha512-FUJEx2BGJPU1qVQoWd9v7wpOwnCPTWhcE4iTaU5prry9SvwiI11lCXOci8Nz9cM/Fuf650l7Skg6nlVeCYjPFA==", + "dev": true, + "requires": { + "@types/react": "*" + } + }, "@types/stack-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", @@ -1339,6 +1456,12 @@ "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", "dev": true }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", + "dev": true + }, "asn1": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", @@ -1845,6 +1968,12 @@ } } }, + "brcast": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/brcast/-/brcast-3.0.1.tgz", + "integrity": "sha512-eI3yqf9YEqyGl9PCNTR46MGvDylGtaHjalcz6Q3fAPnP/PhpKkkve52vFdfGpwp4VUvK6LUr4TQN+2stCrEwTg==", + "dev": true + }, "brorand": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", @@ -2064,6 +2193,12 @@ "supports-color": "^5.3.0" } }, + "change-emitter": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/change-emitter/-/change-emitter-0.1.6.tgz", + "integrity": "sha1-6LL+PX8at9aaMhma/5HqaTFAlRU=", + "dev": true + }, "chardet": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", @@ -2136,6 +2271,12 @@ } } }, + "classnames": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz", + "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==", + "dev": true + }, "cli-cursor": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", @@ -2401,6 +2542,15 @@ } } }, + "css-vendor": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/css-vendor/-/css-vendor-0.3.8.tgz", + "integrity": "sha1-ZCHP0wNM5mT+dnOXL9ARn8KJQfo=", + "dev": true, + "requires": { + "is-in-browser": "^1.0.2" + } + }, "cssom": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.6.tgz", @@ -2416,6 +2566,12 @@ "cssom": "0.3.x" } }, + "csstype": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.3.tgz", + "integrity": "sha512-rINUZXOkcBmoHWEyu7JdHu5JMzkGRoMX4ov9830WNgxf5UYxcBUO0QTKAqeJ5EZfSdlrcJYkC8WwfVW7JYi4yg==", + "dev": true + }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -2455,6 +2611,12 @@ "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", "dev": true }, + "debounce": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.0.tgz", + "integrity": "sha512-mYtLl1xfZLi1m4RtQYlZgJUNQjl4ZxVnHzIR8nLLgi4q1YT8o/WM+MK/f8yfcc9s5Ir5zRaPZyZU6xs1Syoocg==", + "dev": true + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -2482,6 +2644,12 @@ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, + "deepmerge": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-3.2.0.tgz", + "integrity": "sha512-6+LuZGU7QCNUnAJyX8cIrlzoEgggTM6B7mm+znKOX4t5ltluT9KLjN6g61ECMS0LTsLW7yDpNoxhix5FZcrIow==", + "dev": true + }, "default-require-extensions": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", @@ -2589,6 +2757,15 @@ "esutils": "^2.0.2" } }, + "dom-helpers": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz", + "integrity": "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==", + "dev": true, + "requires": { + "@babel/runtime": "^7.1.2" + } + }, "dom-testing-library": { "version": "3.18.1", "resolved": "https://registry.npmjs.org/dom-testing-library/-/dom-testing-library-3.18.1.tgz", @@ -2647,6 +2824,15 @@ "minimalistic-crypto-utils": "^1.0.0" } }, + "encoding": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "dev": true, + "requires": { + "iconv-lite": "~0.4.13" + } + }, "end-of-stream": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", @@ -2823,9 +3009,9 @@ } }, "eslint-config-mcrowder65": { - "version": "0.0.41", - "resolved": "https://registry.npmjs.org/eslint-config-mcrowder65/-/eslint-config-mcrowder65-0.0.41.tgz", - "integrity": "sha512-w937LXC8++iLfEUFzi1Q44GWURoYCFwAAifPBWfMZqK489wFh8keKYqt5a/VJ1Ouu0jSLtF0ELp0OWH+2Z3isA==", + "version": "0.0.45", + "resolved": "https://registry.npmjs.org/eslint-config-mcrowder65/-/eslint-config-mcrowder65-0.0.45.tgz", + "integrity": "sha512-l4Nwb7X1srhwTQrRG+g2yIqoPb4ArWfwgEtGFEe+uLUK8mCVXk5uUw0nvjyzHIPmu2VQyQZVMWMr4upMbN1TXw==", "dev": true, "requires": { "babel-eslint": "8.2.6", @@ -3375,6 +3561,29 @@ "bser": "^2.0.0" } }, + "fbjs": { + "version": "0.8.17", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.17.tgz", + "integrity": "sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90=", + "dev": true, + "requires": { + "core-js": "^1.0.0", + "isomorphic-fetch": "^2.1.1", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^0.7.18" + }, + "dependencies": { + "core-js": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=", + "dev": true + } + } + }, "figures": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", @@ -4259,6 +4468,15 @@ "minimalistic-crypto-utils": "^1.0.1" } }, + "hoist-non-react-statics": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.0.tgz", + "integrity": "sha512-0XsbTXxgiaCDYDIWFcwkmerZPSwywfUqYmwT4jzewKTQSWoE6FCMoUVOeBJWK3E/CrWbxRG3m5GzY4lnIwGRBA==", + "dev": true, + "requires": { + "react-is": "^16.7.0" + } + }, "hosted-git-info": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", @@ -4291,6 +4509,12 @@ "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", "dev": true }, + "hyphenate-style-name": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.3.tgz", + "integrity": "sha512-EcuixamT82oplpoJ2XU4pDtKGWQ7b00CD9f1ug9IaQ3p1bkHMiKCZ9ut9QDI6qsa6cpUuB+A/I+zLtdNK4n2DQ==", + "dev": true + }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -4339,6 +4563,15 @@ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, + "indefinite-observable": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/indefinite-observable/-/indefinite-observable-1.0.2.tgz", + "integrity": "sha512-Mps0898zEduHyPhb7UCgNmfzlqNZknVmaFz5qzr0mm04YQ5FGLhAyK/dJ+NaRxGyR6juQXIxh5Ev0xx+qq0nYA==", + "dev": true, + "requires": { + "symbol-observable": "1.2.0" + } + }, "indent-string": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", @@ -4546,6 +4779,12 @@ "is-extglob": "^2.1.1" } }, + "is-in-browser": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz", + "integrity": "sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU=", + "dev": true + }, "is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", @@ -4653,6 +4892,16 @@ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true }, + "isomorphic-fetch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", + "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", + "dev": true, + "requires": { + "node-fetch": "^1.0.1", + "whatwg-fetch": ">=0.10.0" + } + }, "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", @@ -5365,6 +5614,84 @@ "verror": "1.10.0" } }, + "jss": { + "version": "9.8.7", + "resolved": "https://registry.npmjs.org/jss/-/jss-9.8.7.tgz", + "integrity": "sha512-awj3XRZYxbrmmrx9LUSj5pXSUfm12m8xzi/VKeqI1ZwWBtQ0kVPTs3vYs32t4rFw83CgFDukA8wKzOE9sMQnoQ==", + "dev": true, + "requires": { + "is-in-browser": "^1.1.3", + "symbol-observable": "^1.1.0", + "warning": "^3.0.0" + }, + "dependencies": { + "warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", + "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + } + } + }, + "jss-camel-case": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jss-camel-case/-/jss-camel-case-6.1.0.tgz", + "integrity": "sha512-HPF2Q7wmNW1t79mCqSeU2vdd/vFFGpkazwvfHMOhPlMgXrJDzdj9viA2SaHk9ZbD5pfL63a8ylp4++irYbbzMQ==", + "dev": true, + "requires": { + "hyphenate-style-name": "^1.0.2" + } + }, + "jss-default-unit": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/jss-default-unit/-/jss-default-unit-8.0.2.tgz", + "integrity": "sha512-WxNHrF/18CdoAGw2H0FqOEvJdREXVXLazn7PQYU7V6/BWkCV0GkmWsppNiExdw8dP4TU1ma1dT9zBNJ95feLmg==", + "dev": true + }, + "jss-global": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/jss-global/-/jss-global-3.0.0.tgz", + "integrity": "sha512-wxYn7vL+TImyQYGAfdplg7yaxnPQ9RaXY/cIA8hawaVnmmWxDHzBK32u1y+RAvWboa3lW83ya3nVZ/C+jyjZ5Q==", + "dev": true + }, + "jss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/jss-nested/-/jss-nested-6.0.1.tgz", + "integrity": "sha512-rn964TralHOZxoyEgeq3hXY8hyuCElnvQoVrQwKHVmu55VRDd6IqExAx9be5HgK0yN/+hQdgAXQl/GUrBbbSTA==", + "dev": true, + "requires": { + "warning": "^3.0.0" + }, + "dependencies": { + "warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", + "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + } + } + }, + "jss-props-sort": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/jss-props-sort/-/jss-props-sort-6.0.0.tgz", + "integrity": "sha512-E89UDcrphmI0LzmvYk25Hp4aE5ZBsXqMWlkFXS0EtPkunJkRr+WXdCNYbXbksIPnKlBenGB9OxzQY+mVc70S+g==", + "dev": true + }, + "jss-vendor-prefixer": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/jss-vendor-prefixer/-/jss-vendor-prefixer-7.0.0.tgz", + "integrity": "sha512-Agd+FKmvsI0HLcYXkvy8GYOw3AAASBUpsmIRvVQheps+JWaN892uFOInTr0DRydwaD91vSSUCU4NssschvF7MA==", + "dev": true, + "requires": { + "css-vendor": "^0.3.8" + } + }, "jsx-ast-utils": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz", @@ -5758,6 +6085,16 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, + "node-fetch": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", + "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", + "dev": true, + "requires": { + "encoding": "^0.1.11", + "is-stream": "^1.0.1" + } + }, "node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -5850,6 +6187,12 @@ "dev": true, "optional": true }, + "normalize-scroll-left": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-scroll-left/-/normalize-scroll-left-0.1.2.tgz", + "integrity": "sha512-F9YMRls0zCF6BFIE2YnXDRpHPpfd91nOIaNdDgrx5YMoPLo8Wqj+6jNXHQsYBavJeXP4ww8HCt0xQAKc5qk2Fg==", + "dev": true + }, "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", @@ -6283,6 +6626,12 @@ "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", "dev": true }, + "popper.js": { + "version": "1.14.7", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.14.7.tgz", + "integrity": "sha512-4q1hNvoUre/8srWsH7hnoSJ5xVmIL4qgz+s4qf2TnJIMyZFUFMGH+9vE7mXynAlHSZ/NdTmmow86muD0myUkVQ==", + "dev": true + }, "posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", @@ -6345,6 +6694,15 @@ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dev": true, + "requires": { + "asap": "~2.0.3" + } + }, "prompts": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.0.4.tgz", @@ -6469,12 +6827,29 @@ "scheduler": "^0.13.4" } }, + "react-event-listener": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/react-event-listener/-/react-event-listener-0.6.6.tgz", + "integrity": "sha512-+hCNqfy7o9wvO6UgjqFmBzARJS7qrNoda0VqzvOuioEpoEXKutiKuv92dSz6kP7rYLmyHPyYNLesi5t/aH1gfw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.2.0", + "prop-types": "^15.6.0", + "warning": "^4.0.1" + } + }, "react-is": { "version": "16.8.4", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.4.tgz", "integrity": "sha512-PVadd+WaUDOAciICm/J1waJaSvgq+4rHE/K70j0PFqKhkTBsPv/82UGQJNXAngz1fOQLLxI6z1sEDmJDQhCTAA==", "dev": true }, + "react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==", + "dev": true + }, "react-testing-library": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/react-testing-library/-/react-testing-library-6.0.0.tgz", @@ -6485,6 +6860,18 @@ "dom-testing-library": "^3.13.1" } }, + "react-transition-group": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.6.1.tgz", + "integrity": "sha512-9DHwCy0aOYEe35frlEN68N9ut/THDQBLnVoQuKTvzF4/s3tk7lqkefCqxK2Nv96fOh6JXk6tQtliygk6tl3bQA==", + "dev": true, + "requires": { + "dom-helpers": "^3.3.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2", + "react-lifecycles-compat": "^3.0.4" + } + }, "read-pkg": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", @@ -6542,6 +6929,28 @@ "util.promisify": "^1.0.0" } }, + "recompose": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/recompose/-/recompose-0.30.0.tgz", + "integrity": "sha512-ZTrzzUDa9AqUIhRk4KmVFihH0rapdCSMFXjhHbNrjAWxBuUD/guYlyysMnuHjlZC/KRiOKRtB4jf96yYSkKE8w==", + "dev": true, + "requires": { + "@babel/runtime": "^7.0.0", + "change-emitter": "^0.1.2", + "fbjs": "^0.8.1", + "hoist-non-react-statics": "^2.3.1", + "react-lifecycles-compat": "^3.0.2", + "symbol-observable": "^1.0.4" + }, + "dependencies": { + "hoist-non-react-statics": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz", + "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==", + "dev": true + } + } + }, "redent": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", @@ -7342,6 +7751,12 @@ "has-flag": "^3.0.0" } }, + "symbol-observable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", + "dev": true + }, "symbol-tree": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz", @@ -7571,6 +7986,12 @@ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", "dev": true }, + "ua-parser-js": { + "version": "0.7.19", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.19.tgz", + "integrity": "sha512-T3PVJ6uz8i0HzPxOF9SWzWAlfN/DavlpQqepn22xgve/5QecC+XMCAtmUNnY7C9StehaV6exjUCI801lOI7QlQ==", + "dev": true + }, "uglify-js": { "version": "3.4.10", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", @@ -7825,6 +8246,15 @@ "makeerror": "1.0.x" } }, + "warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, "webidl-conversions": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", @@ -7840,6 +8270,12 @@ "iconv-lite": "0.4.24" } }, + "whatwg-fetch": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz", + "integrity": "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==", + "dev": true + }, "whatwg-mimetype": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", diff --git a/package.json b/package.json index 45c72c1..0caa68a 100644 --- a/package.json +++ b/package.json @@ -33,18 +33,21 @@ } }, "peerDependencies": { + "@material-ui/core": "3.9.2", "react": "16.8.4", "react-dom": "16.8.4" }, "devDependencies": { "@babel/cli": "7.2.3", "@babel/core": "7.2.2", + "@babel/plugin-proposal-class-properties": "7.4.0", "@babel/preset-env": "7.3.1", "@babel/preset-react": "7.0.0", + "@material-ui/core": "3.9.2", "babel-jest": "24.0.0", "babel-polyfill": "6.26.0", "coveralls": "3.0.2", - "eslint-config-mcrowder65": "0.0.41", + "eslint-config-mcrowder65": "0.0.45", "jest": "^24.4.0", "jest-dom": "3.0.1", "react": "16.8.4", diff --git a/src/__tests__/compose.test.js b/src/__tests__/compose.test.js new file mode 100644 index 0000000..d5c1377 --- /dev/null +++ b/src/__tests__/compose.test.js @@ -0,0 +1,16 @@ +import { compose } from "../compose"; + +test("that it doesn't throw when you don't pass anything it doesn't throw", () => { + const val = compose(); + + expect(val("pickles")).toEqual("pickles"); +}); +test("that it calls multiple functions", () => { + const add5 = (num) => num + 5; + + const add10 = compose( + add5, + add5, + ); + expect(add10(5)).toEqual(15); +}); diff --git a/src/__tests__/default-value.test.js b/src/__tests__/default-value.test.js new file mode 100644 index 0000000..0071c2a --- /dev/null +++ b/src/__tests__/default-value.test.js @@ -0,0 +1,11 @@ +import DefaultValue from "../default-value"; + +test("when value is undefined, null is returned", () => { + expect(DefaultValue({ value: undefined })).toEqual(null); +}); + +test("when children is defined, defined is returned", () => { + expect(DefaultValue({ value: "hello!", children: "pickles" })).toEqual( + "pickles", + ); +}); diff --git a/src/__tests__/loader-button.test.js b/src/__tests__/loader-button.test.js new file mode 100644 index 0000000..f9d29ce --- /dev/null +++ b/src/__tests__/loader-button.test.js @@ -0,0 +1,13 @@ +import React from "react"; +import { render } from "../../test/test-utils"; +import LoaderButton from "../loader-button"; + +test("that it renders without issues", () => { + render(); +}); + +test("that it renders a CircularProgress when isFetching is true", () => { + const { getByTestId } = render(); + + expect(getByTestId("circular-progress")).toBeInTheDocument(); +}); diff --git a/src/__tests__/loader-card.test.js b/src/__tests__/loader-card.test.js new file mode 100644 index 0000000..743e2d9 --- /dev/null +++ b/src/__tests__/loader-card.test.js @@ -0,0 +1,13 @@ +import React from "react"; +import { render } from "../../test/test-utils"; +import LoaderCard from "../loader-card"; + +test("that it renders without errors", () => { + render(); +}); + +test("that it renders a CircularProgress when isFetching is true", () => { + const { getByTestId } = render(); + + expect(getByTestId("linear-progress")).toBeInTheDocument(); +}); diff --git a/src/__tests__/login.test.js b/src/__tests__/login.test.js new file mode 100644 index 0000000..08604b0 --- /dev/null +++ b/src/__tests__/login.test.js @@ -0,0 +1,7 @@ +import React from "react"; +import { render } from "../../test/test-utils"; +import Login from "../login"; + +test("that it renders without issues", () => { + render(); +}); diff --git a/src/compose.js b/src/compose.js new file mode 100644 index 0000000..55e1bea --- /dev/null +++ b/src/compose.js @@ -0,0 +1,12 @@ +// copy and paste from redux/compose +export const compose = (...funcs) => { + if (funcs.length === 0) { + return (arg) => arg; + } + + if (funcs.length === 1) { + return funcs[0]; + } + + return funcs.reduce((a, b) => (...args) => a(b(...args))); +}; diff --git a/src/default-value.js b/src/default-value.js new file mode 100644 index 0000000..a895435 --- /dev/null +++ b/src/default-value.js @@ -0,0 +1,10 @@ +import PropTypes from "prop-types"; + +function DefaultValue({ children, value }) { + return value === undefined ? null : children; +} +DefaultValue.propTypes = { + children: PropTypes.node.isRequired, + value: PropTypes.any, +}; +export default DefaultValue; diff --git a/src/loader-button.js b/src/loader-button.js new file mode 100644 index 0000000..cc2c19b --- /dev/null +++ b/src/loader-button.js @@ -0,0 +1,40 @@ +import React from "react"; +import PropTypes from "prop-types"; +import Button from "@material-ui/core/Button"; +import CircularProgress from "@material-ui/core/CircularProgress"; +import withStyles from "@material-ui/core/styles/withStyles"; + +function LoaderButton(props) { + const { children, isFetching, classes, circleSize, ...otherProps } = props; + return ( + + ); +} + +LoaderButton.propTypes = { + children: PropTypes.node.isRequired, + isFetching: PropTypes.bool.isRequired, + classes: PropTypes.object.isRequired, + circleSize: PropTypes.number, +}; + +LoaderButton.defaultProps = { + isFetching: false, + circleSize: 30, +}; +const styles = { + loader: { + position: "absolute", + }, +}; + +export default withStyles(styles)(LoaderButton); diff --git a/src/loader-card.js b/src/loader-card.js new file mode 100644 index 0000000..48dce24 --- /dev/null +++ b/src/loader-card.js @@ -0,0 +1,18 @@ +import React from "react"; +import PropTypes from "prop-types"; +import { Card, LinearProgress } from "@material-ui/core"; + +function LoaderCard({ children, isFetching, ...props }) { + return ( + + {isFetching ? : null} + {children} + + ); +} +LoaderCard.propTypes = { + children: PropTypes.node.isRequired, + isFetching: PropTypes.bool.isRequired, +}; + +export default LoaderCard; diff --git a/src/login.js b/src/login.js new file mode 100644 index 0000000..49c0279 --- /dev/null +++ b/src/login.js @@ -0,0 +1,71 @@ +import React from "react"; +import PropTypes from "prop-types"; +import FormControl from "@material-ui/core/FormControl"; +import Input from "@material-ui/core/Input"; +import InputLabel from "@material-ui/core/InputLabel"; +import Button from "@material-ui/core/Button"; +import Typography from "@material-ui/core/Typography"; +import Card from "@material-ui/core/Card"; +import Grid from "@material-ui/core/Grid"; +import withStyles from "@material-ui/core/styles/withStyles"; + +import { compose } from "./compose"; + +const styles = { + content: { + display: "flex", + justifyContent: "center", + alignItems: "center", + }, + card: { + width: 450, + padding: 20, + }, +}; + +function Login({ classes, _onSubmit }) { + return ( + + Login +
+ + + + Email Address + + + + + + Password + + + + + + + +
+
+ ); +} +Login.propTypes = { + classes: PropTypes.object.isRequired, + _onSubmit: PropTypes.func.isRequired, +}; +const enhance = compose(withStyles(styles)); + +export default enhance(Login); diff --git a/test/test-utils.js b/test/test-utils.js new file mode 100644 index 0000000..871b791 --- /dev/null +++ b/test/test-utils.js @@ -0,0 +1,10 @@ +import React from "react"; +import { render as rtlRender } from "react-testing-library"; +import { MuiThemeProvider, createMuiTheme } from "@material-ui/core/styles"; + +export const render = (yourComponent) => { + const theme = createMuiTheme(); + return rtlRender( + {yourComponent}, + ); +}; From 6a52251cac82d67ca1580bb47ee56c2daff958dd Mon Sep 17 00:00:00 2001 From: Matt Crowder Date: Wed, 20 Mar 2019 22:23:52 -0400 Subject: [PATCH 2/9] need to add docs --- lib/compose.js | 31 ++++++++++ lib/default-value.js | 23 ++++++++ lib/get-elements.js | 22 ++++++++ lib/index.js | 45 +++++++++++++++ lib/loader-button.js | 60 ++++++++++++++++++++ lib/loader-card.js | 35 ++++++++++++ lib/login.js | 103 ++++++++++++++++++++++++++++++++++ lib/sleep.js | 14 +++++ lib/use-arrow-key-listener.js | 73 ++++++++++++++++++++++++ lib/use-current-state.js | 53 +++++++++++++++++ lib/use-loader.js | 77 +++++++++++++++++++++++++ src/index.js | 18 +++++- 12 files changed, 553 insertions(+), 1 deletion(-) create mode 100644 lib/compose.js create mode 100644 lib/default-value.js create mode 100644 lib/get-elements.js create mode 100644 lib/index.js create mode 100644 lib/loader-button.js create mode 100644 lib/loader-card.js create mode 100644 lib/login.js create mode 100644 lib/sleep.js create mode 100644 lib/use-arrow-key-listener.js create mode 100644 lib/use-current-state.js create mode 100644 lib/use-loader.js diff --git a/lib/compose.js b/lib/compose.js new file mode 100644 index 0000000..6b27188 --- /dev/null +++ b/lib/compose.js @@ -0,0 +1,31 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.compose = void 0; + +// copy and paste from redux/compose +var compose = function compose() { + for (var _len = arguments.length, funcs = new Array(_len), _key = 0; _key < _len; _key++) { + funcs[_key] = arguments[_key]; + } + + if (funcs.length === 0) { + return function (arg) { + return arg; + }; + } + + if (funcs.length === 1) { + return funcs[0]; + } + + return funcs.reduce(function (a, b) { + return function () { + return a(b.apply(void 0, arguments)); + }; + }); +}; + +exports.compose = compose; \ No newline at end of file diff --git a/lib/default-value.js b/lib/default-value.js new file mode 100644 index 0000000..d2d7faf --- /dev/null +++ b/lib/default-value.js @@ -0,0 +1,23 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _propTypes = _interopRequireDefault(require("prop-types")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function DefaultValue(_ref) { + var children = _ref.children, + value = _ref.value; + return value === undefined ? null : children; +} + +DefaultValue.propTypes = { + children: _propTypes.default.node.isRequired, + value: _propTypes.default.any +}; +var _default = DefaultValue; +exports.default = _default; \ No newline at end of file diff --git a/lib/get-elements.js b/lib/get-elements.js new file mode 100644 index 0000000..5e4de66 --- /dev/null +++ b/lib/get-elements.js @@ -0,0 +1,22 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.getElements = void 0; + +var getElements = function getElements(e) { + return Object.values(e.target.elements).reduce(function (accum, _ref) { + var value = _ref.value, + name = _ref.name; + + if (name) { + // eslint-disable-next-line no-param-reassign + accum[name] = value; + } + + return accum; + }, {}); +}; + +exports.getElements = getElements; \ No newline at end of file diff --git a/lib/index.js b/lib/index.js new file mode 100644 index 0000000..8a0e616 --- /dev/null +++ b/lib/index.js @@ -0,0 +1,45 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "useArrowKeyListener", { + enumerable: true, + get: function get() { + return _useArrowKeyListener.useArrowKeyListener; + } +}); +Object.defineProperty(exports, "useCurrentState", { + enumerable: true, + get: function get() { + return _useCurrentState.useCurrentState; + } +}); +Object.defineProperty(exports, "getElements", { + enumerable: true, + get: function get() { + return _getElements.getElements; + } +}); +Object.defineProperty(exports, "useLoader", { + enumerable: true, + get: function get() { + return _useLoader.useLoader; + } +}); +Object.defineProperty(exports, "sleep", { + enumerable: true, + get: function get() { + return _sleep.sleep; + } +}); + +var _useArrowKeyListener = require("./use-arrow-key-listener"); + +var _useCurrentState = require("./use-current-state"); + +var _getElements = require("./get-elements"); + +var _useLoader = require("./use-loader"); + +var _sleep = require("./sleep"); \ No newline at end of file diff --git a/lib/loader-button.js b/lib/loader-button.js new file mode 100644 index 0000000..7ec95ee --- /dev/null +++ b/lib/loader-button.js @@ -0,0 +1,60 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _react = _interopRequireDefault(require("react")); + +var _propTypes = _interopRequireDefault(require("prop-types")); + +var _Button = _interopRequireDefault(require("@material-ui/core/Button")); + +var _CircularProgress = _interopRequireDefault(require("@material-ui/core/CircularProgress")); + +var _withStyles = _interopRequireDefault(require("@material-ui/core/styles/withStyles")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } + +function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; } + +function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; } + +function LoaderButton(props) { + var children = props.children, + isFetching = props.isFetching, + classes = props.classes, + circleSize = props.circleSize, + otherProps = _objectWithoutProperties(props, ["children", "isFetching", "classes", "circleSize"]); + + return _react.default.createElement(_Button.default, _extends({}, otherProps, { + disabled: isFetching === true + }), children, isFetching ? _react.default.createElement(_CircularProgress.default, { + size: circleSize, + className: classes.loader, + "data-testid": "circular-progress" + }) : null); +} + +LoaderButton.propTypes = { + children: _propTypes.default.node.isRequired, + isFetching: _propTypes.default.bool.isRequired, + classes: _propTypes.default.object.isRequired, + circleSize: _propTypes.default.number +}; +LoaderButton.defaultProps = { + isFetching: false, + circleSize: 30 +}; +var styles = { + loader: { + position: "absolute" + } +}; + +var _default = (0, _withStyles.default)(styles)(LoaderButton); + +exports.default = _default; \ No newline at end of file diff --git a/lib/loader-card.js b/lib/loader-card.js new file mode 100644 index 0000000..243d627 --- /dev/null +++ b/lib/loader-card.js @@ -0,0 +1,35 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _react = _interopRequireDefault(require("react")); + +var _propTypes = _interopRequireDefault(require("prop-types")); + +var _core = require("@material-ui/core"); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; } + +function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; } + +function LoaderCard(_ref) { + var children = _ref.children, + isFetching = _ref.isFetching, + props = _objectWithoutProperties(_ref, ["children", "isFetching"]); + + return _react.default.createElement(_core.Card, props, isFetching ? _react.default.createElement(_core.LinearProgress, { + "data-testid": "linear-progress" + }) : null, children); +} + +LoaderCard.propTypes = { + children: _propTypes.default.node.isRequired, + isFetching: _propTypes.default.bool.isRequired +}; +var _default = LoaderCard; +exports.default = _default; \ No newline at end of file diff --git a/lib/login.js b/lib/login.js new file mode 100644 index 0000000..fcfb94e --- /dev/null +++ b/lib/login.js @@ -0,0 +1,103 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _react = _interopRequireDefault(require("react")); + +var _propTypes = _interopRequireDefault(require("prop-types")); + +var _FormControl = _interopRequireDefault(require("@material-ui/core/FormControl")); + +var _Input = _interopRequireDefault(require("@material-ui/core/Input")); + +var _InputLabel = _interopRequireDefault(require("@material-ui/core/InputLabel")); + +var _Button = _interopRequireDefault(require("@material-ui/core/Button")); + +var _Typography = _interopRequireDefault(require("@material-ui/core/Typography")); + +var _Card = _interopRequireDefault(require("@material-ui/core/Card")); + +var _Grid = _interopRequireDefault(require("@material-ui/core/Grid")); + +var _withStyles = _interopRequireDefault(require("@material-ui/core/styles/withStyles")); + +var _compose = require("./compose"); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var styles = { + content: { + display: "flex", + justifyContent: "center", + alignItems: "center" + }, + card: { + width: 450, + padding: 20 + } +}; + +function Login(_ref) { + var classes = _ref.classes, + _onSubmit = _ref._onSubmit; + return _react.default.createElement(_Card.default, { + className: classes.card + }, _react.default.createElement(_Typography.default, { + variant: "h4" + }, "Login"), _react.default.createElement("form", { + className: classes.content, + onSubmit: _onSubmit + }, _react.default.createElement(_Grid.default, { + container: true, + alignItems: "center", + direction: "column" + }, _react.default.createElement(_Grid.default, { + item: true + }, _react.default.createElement(_FormControl.default, { + margin: "normal", + required: true, + fullWidth: true + }, _react.default.createElement(_InputLabel.default, { + htmlFor: "email" + }, "Email Address"), _react.default.createElement(_Input.default, { + id: "email", + name: "email", + autoComplete: "email", + autoFocus: true + }))), _react.default.createElement(_Grid.default, { + item: true + }, _react.default.createElement(_FormControl.default, { + margin: "normal", + required: true, + fullWidth: true + }, _react.default.createElement(_InputLabel.default, { + htmlFor: "password" + }, "Password"), _react.default.createElement(_Input.default, { + name: "password", + type: "password", + id: "password", + autoComplete: "current-password" + }))), _react.default.createElement(_Grid.default, { + item: true + }, _react.default.createElement(_Button.default, { + type: "submit", + fullWidth: true, + variant: "contained", + color: "primary", + className: classes.submit + }, "Sign in"))))); +} + +Login.propTypes = { + classes: _propTypes.default.object.isRequired, + _onSubmit: _propTypes.default.func.isRequired +}; +var enhance = (0, _compose.compose)((0, _withStyles.default)(styles)); + +var _default = enhance(Login); + +exports.default = _default; \ No newline at end of file diff --git a/lib/sleep.js b/lib/sleep.js new file mode 100644 index 0000000..f87f1d4 --- /dev/null +++ b/lib/sleep.js @@ -0,0 +1,14 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.sleep = void 0; + +var sleep = function sleep(time) { + return new Promise(function (resolve) { + setTimeout(resolve, time); + }); +}; + +exports.sleep = sleep; \ No newline at end of file diff --git a/lib/use-arrow-key-listener.js b/lib/use-arrow-key-listener.js new file mode 100644 index 0000000..5e70ff8 --- /dev/null +++ b/lib/use-arrow-key-listener.js @@ -0,0 +1,73 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.useArrowKeyListener = void 0; + +var _react = _interopRequireDefault(require("react")); + +var _useCurrentState3 = require("./use-current-state"); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); } + +function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } + +function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } + +function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } + +var POSSIBLE_KEYS = { + ARROW_LEFT: "ArrowLeft", + ARROW_RIGHT: "ArrowRight" +}; + +var useArrowKeyListener = function useArrowKeyListener(_ref) { + var onLeftKeyPress = _ref.onLeftKeyPress, + onRightKeyPress = _ref.onRightKeyPress; + + var _useCurrentState = (0, _useCurrentState3.useCurrentState)(0), + _useCurrentState2 = _slicedToArray(_useCurrentState, 2), + getFocusCount = _useCurrentState2[0], + setFocusCount = _useCurrentState2[1]; + + var handleKey = function handleKey(_ref2) { + var key = _ref2.key; + + if (getFocusCount() === 0) { + if (key === POSSIBLE_KEYS.ARROW_LEFT) { + onLeftKeyPress(); + } else if (key === POSSIBLE_KEYS.ARROW_RIGHT) { + onRightKeyPress(); + } + } + }; + + _react.default.useEffect(function () { + window.addEventListener("keydown", handleKey); + return function () { + window.removeEventListener("keydown", handleKey); + }; + }, []); + + var onBlur = function onBlur() { + return setFocusCount(function (state) { + return state - 1; + }); + }; + + var onFocus = function onFocus() { + return setFocusCount(function (state) { + return state + 1; + }); + }; + + return { + onBlur: onBlur, + onFocus: onFocus + }; +}; + +exports.useArrowKeyListener = useArrowKeyListener; \ No newline at end of file diff --git a/lib/use-current-state.js b/lib/use-current-state.js new file mode 100644 index 0000000..05b55aa --- /dev/null +++ b/lib/use-current-state.js @@ -0,0 +1,53 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.useCurrentState = void 0; + +var _react = _interopRequireDefault(require("react")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); } + +function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } + +function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } + +function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } + +var useCurrentState = function useCurrentState(initialValue) { + var actualInitialValue = initialValue; + + if (typeof initialValue === "function") { + actualInitialValue = initialValue(actualInitialValue); + } + + var _React$useState = _react.default.useState(actualInitialValue), + _React$useState2 = _slicedToArray(_React$useState, 2), + value = _React$useState2[0], + setValue = _React$useState2[1]; + + var actualValue = _react.default.useRef(actualInitialValue); + + var theirSetValue = function theirSetValue(theirNewValue) { + var valueToSet; + + if (typeof theirNewValue === "function") { + valueToSet = theirNewValue(value); + setValue(valueToSet); + } else { + setValue(theirNewValue); + valueToSet = theirNewValue; + } + + actualValue.current = valueToSet; + }; + + return [function () { + return actualValue.current; + }, theirSetValue]; +}; + +exports.useCurrentState = useCurrentState; \ No newline at end of file diff --git a/lib/use-loader.js b/lib/use-loader.js new file mode 100644 index 0000000..e60fd96 --- /dev/null +++ b/lib/use-loader.js @@ -0,0 +1,77 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.useLoader = useLoader; + +var _react = _interopRequireDefault(require("react")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } + +function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } + +function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); } + +function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } + +function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } + +function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } + +function useLoader(apiCall) { + var _React$useState = _react.default.useState(false), + _React$useState2 = _slicedToArray(_React$useState, 2), + isLoading = _React$useState2[0], + setLoading = _React$useState2[1]; + + var newApiCall = + /*#__PURE__*/ + function () { + var _ref = _asyncToGenerator( + /*#__PURE__*/ + regeneratorRuntime.mark(function _callee() { + var _args = arguments; + return regeneratorRuntime.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + _context.prev = 0; + setLoading(true); + _context.next = 4; + return apiCall.apply(void 0, _args); + + case 4: + _context.next = 9; + break; + + case 6: + _context.prev = 6; + _context.t0 = _context["catch"](0); + throw _context.t0; + + case 9: + _context.prev = 9; + setLoading(false); + return _context.finish(9); + + case 12: + case "end": + return _context.stop(); + } + } + }, _callee, null, [[0, 6, 9, 12]]); + })); + + return function newApiCall() { + return _ref.apply(this, arguments); + }; + }(); + + return { + isLoading: isLoading, + apiCall: newApiCall + }; +} \ No newline at end of file diff --git a/src/index.js b/src/index.js index 7de5e7c..73724c8 100644 --- a/src/index.js +++ b/src/index.js @@ -3,5 +3,21 @@ import { useCurrentState } from "./use-current-state"; import { getElements } from "./get-elements"; import { useLoader } from "./use-loader"; import { sleep } from "./sleep"; +import { compose } from "./compose"; +import DefaultValue from "./default-value"; +import LoaderButton from "./loader-button"; +import LoaderCard from "./loader-card"; +import Login from "./login"; -export { useArrowKeyListener, useCurrentState, getElements, useLoader, sleep }; +export { + useArrowKeyListener, + useCurrentState, + getElements, + useLoader, + sleep, + compose, + DefaultValue, + LoaderButton, + LoaderCard, + Login, +}; From 7ce297beceb4256527af8d2f06fbb1b2e63c5b40 Mon Sep 17 00:00:00 2001 From: Matt Crowder Date: Thu, 21 Mar 2019 20:29:24 -0400 Subject: [PATCH 3/9] moving around some components. --- src/{ => components/default-value}/default-value.js | 0 .../default-value}/default-value.test.js | 2 +- src/components/loader-button/README.md | 0 src/{ => components/loader-button}/loader-button.js | 0 .../loader-button}/loader-button.test.js | 4 ++-- src/{ => components/loader-card}/loader-card.js | 0 .../loader-card}/loader-card.test.js | 4 ++-- src/{ => components/login}/__tests__/login.test.js | 2 +- src/{ => components/login}/login.js | 2 +- src/index.js | 8 ++++---- 10 files changed, 11 insertions(+), 11 deletions(-) rename src/{ => components/default-value}/default-value.js (100%) rename src/{__tests__ => components/default-value}/default-value.test.js (86%) create mode 100644 src/components/loader-button/README.md rename src/{ => components/loader-button}/loader-button.js (100%) rename src/{__tests__ => components/loader-button}/loader-button.test.js (77%) rename src/{ => components/loader-card}/loader-card.js (100%) rename src/{__tests__ => components/loader-card}/loader-card.test.js (77%) rename src/{ => components/login}/__tests__/login.test.js (70%) rename src/{ => components/login}/login.js (98%) diff --git a/src/default-value.js b/src/components/default-value/default-value.js similarity index 100% rename from src/default-value.js rename to src/components/default-value/default-value.js diff --git a/src/__tests__/default-value.test.js b/src/components/default-value/default-value.test.js similarity index 86% rename from src/__tests__/default-value.test.js rename to src/components/default-value/default-value.test.js index 0071c2a..34d680e 100644 --- a/src/__tests__/default-value.test.js +++ b/src/components/default-value/default-value.test.js @@ -1,4 +1,4 @@ -import DefaultValue from "../default-value"; +import DefaultValue from "./default-value"; test("when value is undefined, null is returned", () => { expect(DefaultValue({ value: undefined })).toEqual(null); diff --git a/src/components/loader-button/README.md b/src/components/loader-button/README.md new file mode 100644 index 0000000..e69de29 diff --git a/src/loader-button.js b/src/components/loader-button/loader-button.js similarity index 100% rename from src/loader-button.js rename to src/components/loader-button/loader-button.js diff --git a/src/__tests__/loader-button.test.js b/src/components/loader-button/loader-button.test.js similarity index 77% rename from src/__tests__/loader-button.test.js rename to src/components/loader-button/loader-button.test.js index f9d29ce..c74b2bb 100644 --- a/src/__tests__/loader-button.test.js +++ b/src/components/loader-button/loader-button.test.js @@ -1,6 +1,6 @@ import React from "react"; -import { render } from "../../test/test-utils"; -import LoaderButton from "../loader-button"; +import { render } from "../../../test/test-utils"; +import LoaderButton from "./loader-button"; test("that it renders without issues", () => { render(); diff --git a/src/loader-card.js b/src/components/loader-card/loader-card.js similarity index 100% rename from src/loader-card.js rename to src/components/loader-card/loader-card.js diff --git a/src/__tests__/loader-card.test.js b/src/components/loader-card/loader-card.test.js similarity index 77% rename from src/__tests__/loader-card.test.js rename to src/components/loader-card/loader-card.test.js index 743e2d9..ec37edd 100644 --- a/src/__tests__/loader-card.test.js +++ b/src/components/loader-card/loader-card.test.js @@ -1,6 +1,6 @@ import React from "react"; -import { render } from "../../test/test-utils"; -import LoaderCard from "../loader-card"; +import { render } from "../../../test/test-utils"; +import LoaderCard from "./loader-card"; test("that it renders without errors", () => { render(); diff --git a/src/__tests__/login.test.js b/src/components/login/__tests__/login.test.js similarity index 70% rename from src/__tests__/login.test.js rename to src/components/login/__tests__/login.test.js index 08604b0..e2c0004 100644 --- a/src/__tests__/login.test.js +++ b/src/components/login/__tests__/login.test.js @@ -1,5 +1,5 @@ import React from "react"; -import { render } from "../../test/test-utils"; +import { render } from "../../../../test/test-utils"; import Login from "../login"; test("that it renders without issues", () => { diff --git a/src/login.js b/src/components/login/login.js similarity index 98% rename from src/login.js rename to src/components/login/login.js index 49c0279..ac794fe 100644 --- a/src/login.js +++ b/src/components/login/login.js @@ -9,7 +9,7 @@ import Card from "@material-ui/core/Card"; import Grid from "@material-ui/core/Grid"; import withStyles from "@material-ui/core/styles/withStyles"; -import { compose } from "./compose"; +import { compose } from "../../compose"; const styles = { content: { diff --git a/src/index.js b/src/index.js index 73724c8..68f5261 100644 --- a/src/index.js +++ b/src/index.js @@ -4,10 +4,10 @@ import { getElements } from "./get-elements"; import { useLoader } from "./use-loader"; import { sleep } from "./sleep"; import { compose } from "./compose"; -import DefaultValue from "./default-value"; -import LoaderButton from "./loader-button"; -import LoaderCard from "./loader-card"; -import Login from "./login"; +import DefaultValue from "./components/default-value/default-value"; +import LoaderButton from "./components/loader-button/loader-button"; +import LoaderCard from "./components/loader-card/loader-card"; +import Login from "./components/login/login"; export { useArrowKeyListener, From a5f9fbf43ac3d4b039c429e50247d2169a459f1c Mon Sep 17 00:00:00 2001 From: Matt Crowder Date: Thu, 21 Mar 2019 20:31:34 -0400 Subject: [PATCH 4/9] added basic readme --- README.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..1d8899a --- /dev/null +++ b/README.md @@ -0,0 +1,4 @@ +## Mooks + +Reusable javascript utilities that serve [Matt Crowder!](https://twitter.com/mcrowder65) + From f929395240a68601f3e4c3082a488d43e691cc79 Mon Sep 17 00:00:00 2001 From: Matt Crowder Date: Thu, 21 Mar 2019 20:48:37 -0400 Subject: [PATCH 5/9] added signup --- package-lock.json | 20 ++++---- package.json | 6 ++- src/components/signup/signup.js | 75 ++++++++++++++++++++++++++++ src/components/signup/signup.test.js | 7 +++ 4 files changed, 97 insertions(+), 11 deletions(-) create mode 100644 src/components/signup/signup.js create mode 100644 src/components/signup/signup.test.js diff --git a/package-lock.json b/package-lock.json index 07303a6..a74a335 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1231,9 +1231,9 @@ } }, "@types/node": { - "version": "11.11.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-11.11.4.tgz", - "integrity": "sha512-02tIL+QIi/RW4E5xILdoAMjeJ9kYq5t5S2vciUdFPXv/ikFTb0zK8q9vXkg4+WAJuYXGiVT1H28AkD2C+IkXVw==", + "version": "11.11.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-11.11.5.tgz", + "integrity": "sha512-pz6wNe/XwyesgfVX7P6B0hY3TnTAYXk6KSTLdpQfbuq3be+hnMoCuFzE+yLTskPdBwmNiGRL2TAsnF09aRugvQ==", "dev": true }, "@types/prop-types": { @@ -5027,13 +5027,13 @@ } }, "jest": { - "version": "24.5.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-24.5.0.tgz", - "integrity": "sha512-lxL+Fq5/RH7inxxmfS2aZLCf8MsS+YCUBfeiNO6BWz/MmjhDGaIEA/2bzEf9q4Q0X+mtFHiinHFvQ0u+RvW/qQ==", + "version": "24.4.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-24.4.0.tgz", + "integrity": "sha512-gAGfjvu8hHN0N6/aDyCBpncWWBcpY6wq69Msq/I6Xd763q/ZYBEMh0SKUomrViFoJ/dyistA6b4aJh8e+5QMyw==", "dev": true, "requires": { "import-local": "^2.0.0", - "jest-cli": "^24.5.0" + "jest-cli": "^24.4.0" }, "dependencies": { "jest-cli": { @@ -7993,9 +7993,9 @@ "dev": true }, "uglify-js": { - "version": "3.4.10", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", - "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.5.1.tgz", + "integrity": "sha512-kI+3c+KphOAKIikQsZoT2oDsVYH5qvhpTtFObfMCdhPAYnjSvmW4oTWMhvDD4jtAGHJwztlBXQgozGcq3Xw9oQ==", "dev": true, "optional": true, "requires": { diff --git a/package.json b/package.json index 0caa68a..816b4ad 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,10 @@ "extends": "mcrowder65" }, "jest": { + "collectCoverageFrom": [ + "src/**/*.js", + "!src/index.js" + ], "setupFilesAfterEnv": [ "/test/config.js" ], @@ -48,7 +52,7 @@ "babel-polyfill": "6.26.0", "coveralls": "3.0.2", "eslint-config-mcrowder65": "0.0.45", - "jest": "^24.4.0", + "jest": "24.4.0", "jest-dom": "3.0.1", "react": "16.8.4", "react-dom": "16.8.4", diff --git a/src/components/signup/signup.js b/src/components/signup/signup.js new file mode 100644 index 0000000..3b73128 --- /dev/null +++ b/src/components/signup/signup.js @@ -0,0 +1,75 @@ +import React from "react"; +import PropTypes from "prop-types"; +import FormControl from "@material-ui/core/FormControl"; +import Input from "@material-ui/core/Input"; +import InputLabel from "@material-ui/core/InputLabel"; +import Button from "@material-ui/core/Button"; +import Grid from "@material-ui/core/Grid"; +import Typography from "@material-ui/core/Typography"; +import Card from "@material-ui/core/Card"; +import withStyles from "@material-ui/core/styles/withStyles"; + +const styles = { + content: { + display: "flex", + justifyContent: "center", + alignItems: "center", + }, + card: { + width: 300, + padding: 20, + }, +}; +function Signup({ classes, _onSubmit }) { + return ( +
+ + + Sign up +
+ + + + Email Address + + + + + + Password + + + + + + + +
+
+
+
+ ); +} +Signup.propTypes = { + classes: PropTypes.object, + _onSubmit: PropTypes.func, +}; + +export default withStyles(styles)(Signup); diff --git a/src/components/signup/signup.test.js b/src/components/signup/signup.test.js new file mode 100644 index 0000000..aff07ab --- /dev/null +++ b/src/components/signup/signup.test.js @@ -0,0 +1,7 @@ +import React from "react"; +import { render } from "../../../test/test-utils"; +import Signup from "./signup"; + +test("that it renders without errors", () => { + render(); +}); From 834711f490fa738cc63a912dff53b76417bf6174 Mon Sep 17 00:00:00 2001 From: Matt Crowder Date: Thu, 21 Mar 2019 21:01:40 -0400 Subject: [PATCH 6/9] ran build --- lib/components/default-value/default-value.js | 23 +++ lib/components/loader-button/loader-button.js | 60 ++++++++ lib/components/loader-card/loader-card.js | 35 +++++ lib/components/login/login.js | 103 +++++++++++++ lib/components/signup/signup.js | 101 +++++++++++++ lib/index.js | 44 +++++- package-lock.json | 142 +++++++++++++++++- package.json | 6 + 8 files changed, 510 insertions(+), 4 deletions(-) create mode 100644 lib/components/default-value/default-value.js create mode 100644 lib/components/loader-button/loader-button.js create mode 100644 lib/components/loader-card/loader-card.js create mode 100644 lib/components/login/login.js create mode 100644 lib/components/signup/signup.js diff --git a/lib/components/default-value/default-value.js b/lib/components/default-value/default-value.js new file mode 100644 index 0000000..d2d7faf --- /dev/null +++ b/lib/components/default-value/default-value.js @@ -0,0 +1,23 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _propTypes = _interopRequireDefault(require("prop-types")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function DefaultValue(_ref) { + var children = _ref.children, + value = _ref.value; + return value === undefined ? null : children; +} + +DefaultValue.propTypes = { + children: _propTypes.default.node.isRequired, + value: _propTypes.default.any +}; +var _default = DefaultValue; +exports.default = _default; \ No newline at end of file diff --git a/lib/components/loader-button/loader-button.js b/lib/components/loader-button/loader-button.js new file mode 100644 index 0000000..7ec95ee --- /dev/null +++ b/lib/components/loader-button/loader-button.js @@ -0,0 +1,60 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _react = _interopRequireDefault(require("react")); + +var _propTypes = _interopRequireDefault(require("prop-types")); + +var _Button = _interopRequireDefault(require("@material-ui/core/Button")); + +var _CircularProgress = _interopRequireDefault(require("@material-ui/core/CircularProgress")); + +var _withStyles = _interopRequireDefault(require("@material-ui/core/styles/withStyles")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } + +function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; } + +function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; } + +function LoaderButton(props) { + var children = props.children, + isFetching = props.isFetching, + classes = props.classes, + circleSize = props.circleSize, + otherProps = _objectWithoutProperties(props, ["children", "isFetching", "classes", "circleSize"]); + + return _react.default.createElement(_Button.default, _extends({}, otherProps, { + disabled: isFetching === true + }), children, isFetching ? _react.default.createElement(_CircularProgress.default, { + size: circleSize, + className: classes.loader, + "data-testid": "circular-progress" + }) : null); +} + +LoaderButton.propTypes = { + children: _propTypes.default.node.isRequired, + isFetching: _propTypes.default.bool.isRequired, + classes: _propTypes.default.object.isRequired, + circleSize: _propTypes.default.number +}; +LoaderButton.defaultProps = { + isFetching: false, + circleSize: 30 +}; +var styles = { + loader: { + position: "absolute" + } +}; + +var _default = (0, _withStyles.default)(styles)(LoaderButton); + +exports.default = _default; \ No newline at end of file diff --git a/lib/components/loader-card/loader-card.js b/lib/components/loader-card/loader-card.js new file mode 100644 index 0000000..243d627 --- /dev/null +++ b/lib/components/loader-card/loader-card.js @@ -0,0 +1,35 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _react = _interopRequireDefault(require("react")); + +var _propTypes = _interopRequireDefault(require("prop-types")); + +var _core = require("@material-ui/core"); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; } + +function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; } + +function LoaderCard(_ref) { + var children = _ref.children, + isFetching = _ref.isFetching, + props = _objectWithoutProperties(_ref, ["children", "isFetching"]); + + return _react.default.createElement(_core.Card, props, isFetching ? _react.default.createElement(_core.LinearProgress, { + "data-testid": "linear-progress" + }) : null, children); +} + +LoaderCard.propTypes = { + children: _propTypes.default.node.isRequired, + isFetching: _propTypes.default.bool.isRequired +}; +var _default = LoaderCard; +exports.default = _default; \ No newline at end of file diff --git a/lib/components/login/login.js b/lib/components/login/login.js new file mode 100644 index 0000000..b548764 --- /dev/null +++ b/lib/components/login/login.js @@ -0,0 +1,103 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _react = _interopRequireDefault(require("react")); + +var _propTypes = _interopRequireDefault(require("prop-types")); + +var _FormControl = _interopRequireDefault(require("@material-ui/core/FormControl")); + +var _Input = _interopRequireDefault(require("@material-ui/core/Input")); + +var _InputLabel = _interopRequireDefault(require("@material-ui/core/InputLabel")); + +var _Button = _interopRequireDefault(require("@material-ui/core/Button")); + +var _Typography = _interopRequireDefault(require("@material-ui/core/Typography")); + +var _Card = _interopRequireDefault(require("@material-ui/core/Card")); + +var _Grid = _interopRequireDefault(require("@material-ui/core/Grid")); + +var _withStyles = _interopRequireDefault(require("@material-ui/core/styles/withStyles")); + +var _compose = require("../../compose"); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var styles = { + content: { + display: "flex", + justifyContent: "center", + alignItems: "center" + }, + card: { + width: 450, + padding: 20 + } +}; + +function Login(_ref) { + var classes = _ref.classes, + _onSubmit = _ref._onSubmit; + return _react.default.createElement(_Card.default, { + className: classes.card + }, _react.default.createElement(_Typography.default, { + variant: "h4" + }, "Login"), _react.default.createElement("form", { + className: classes.content, + onSubmit: _onSubmit + }, _react.default.createElement(_Grid.default, { + container: true, + alignItems: "center", + direction: "column" + }, _react.default.createElement(_Grid.default, { + item: true + }, _react.default.createElement(_FormControl.default, { + margin: "normal", + required: true, + fullWidth: true + }, _react.default.createElement(_InputLabel.default, { + htmlFor: "email" + }, "Email Address"), _react.default.createElement(_Input.default, { + id: "email", + name: "email", + autoComplete: "email", + autoFocus: true + }))), _react.default.createElement(_Grid.default, { + item: true + }, _react.default.createElement(_FormControl.default, { + margin: "normal", + required: true, + fullWidth: true + }, _react.default.createElement(_InputLabel.default, { + htmlFor: "password" + }, "Password"), _react.default.createElement(_Input.default, { + name: "password", + type: "password", + id: "password", + autoComplete: "current-password" + }))), _react.default.createElement(_Grid.default, { + item: true + }, _react.default.createElement(_Button.default, { + type: "submit", + fullWidth: true, + variant: "contained", + color: "primary", + className: classes.submit + }, "Sign in"))))); +} + +Login.propTypes = { + classes: _propTypes.default.object.isRequired, + _onSubmit: _propTypes.default.func.isRequired +}; +var enhance = (0, _compose.compose)((0, _withStyles.default)(styles)); + +var _default = enhance(Login); + +exports.default = _default; \ No newline at end of file diff --git a/lib/components/signup/signup.js b/lib/components/signup/signup.js new file mode 100644 index 0000000..9f5bc73 --- /dev/null +++ b/lib/components/signup/signup.js @@ -0,0 +1,101 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _react = _interopRequireDefault(require("react")); + +var _propTypes = _interopRequireDefault(require("prop-types")); + +var _FormControl = _interopRequireDefault(require("@material-ui/core/FormControl")); + +var _Input = _interopRequireDefault(require("@material-ui/core/Input")); + +var _InputLabel = _interopRequireDefault(require("@material-ui/core/InputLabel")); + +var _Button = _interopRequireDefault(require("@material-ui/core/Button")); + +var _Grid = _interopRequireDefault(require("@material-ui/core/Grid")); + +var _Typography = _interopRequireDefault(require("@material-ui/core/Typography")); + +var _Card = _interopRequireDefault(require("@material-ui/core/Card")); + +var _withStyles = _interopRequireDefault(require("@material-ui/core/styles/withStyles")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var styles = { + content: { + display: "flex", + justifyContent: "center", + alignItems: "center" + }, + card: { + width: 300, + padding: 20 + } +}; + +function Signup(_ref) { + var classes = _ref.classes, + _onSubmit = _ref._onSubmit; + return _react.default.createElement("div", { + className: classes.content + }, _react.default.createElement(_Card.default, { + className: classes.card + }, _react.default.createElement(_Grid.default, null, _react.default.createElement(_Typography.default, { + variant: "h4" + }, "Sign up"), _react.default.createElement("form", { + className: classes.content, + onSubmit: _onSubmit + }, _react.default.createElement(_Grid.default, { + container: true, + alignItems: "center", + direction: "column" + }, _react.default.createElement(_Grid.default, { + item: true + }, _react.default.createElement(_FormControl.default, { + margin: "normal", + required: true, + fullWidth: true + }, _react.default.createElement(_InputLabel.default, { + htmlFor: "email" + }, "Email Address"), _react.default.createElement(_Input.default, { + id: "email", + name: "email", + autoComplete: "email", + autoFocus: true + }))), _react.default.createElement(_Grid.default, { + item: true + }, _react.default.createElement(_FormControl.default, { + margin: "normal", + required: true, + fullWidth: true + }, _react.default.createElement(_InputLabel.default, { + htmlFor: "password" + }, "Password"), _react.default.createElement(_Input.default, { + name: "password", + type: "password", + id: "password", + autoComplete: "current-password" + }))), _react.default.createElement(_Grid.default, { + item: true + }, _react.default.createElement(_Button.default, { + type: "submit", + fullWidth: true, + variant: "contained", + color: "primary" + }, "Sign Up"))))))); +} + +Signup.propTypes = { + classes: _propTypes.default.object, + _onSubmit: _propTypes.default.func +}; + +var _default = (0, _withStyles.default)(styles)(Signup); + +exports.default = _default; \ No newline at end of file diff --git a/lib/index.js b/lib/index.js index 8a0e616..88de42c 100644 --- a/lib/index.js +++ b/lib/index.js @@ -33,6 +33,36 @@ Object.defineProperty(exports, "sleep", { return _sleep.sleep; } }); +Object.defineProperty(exports, "compose", { + enumerable: true, + get: function get() { + return _compose.compose; + } +}); +Object.defineProperty(exports, "DefaultValue", { + enumerable: true, + get: function get() { + return _defaultValue.default; + } +}); +Object.defineProperty(exports, "LoaderButton", { + enumerable: true, + get: function get() { + return _loaderButton.default; + } +}); +Object.defineProperty(exports, "LoaderCard", { + enumerable: true, + get: function get() { + return _loaderCard.default; + } +}); +Object.defineProperty(exports, "Login", { + enumerable: true, + get: function get() { + return _login.default; + } +}); var _useArrowKeyListener = require("./use-arrow-key-listener"); @@ -42,4 +72,16 @@ var _getElements = require("./get-elements"); var _useLoader = require("./use-loader"); -var _sleep = require("./sleep"); \ No newline at end of file +var _sleep = require("./sleep"); + +var _compose = require("./compose"); + +var _defaultValue = _interopRequireDefault(require("./components/default-value/default-value")); + +var _loaderButton = _interopRequireDefault(require("./components/loader-button/loader-button")); + +var _loaderCard = _interopRequireDefault(require("./components/loader-card/loader-card")); + +var _login = _interopRequireDefault(require("./components/login/login")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index a74a335..1a9dffa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2140,6 +2140,23 @@ "unset-value": "^1.0.0" } }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "dev": true, + "requires": { + "callsites": "^2.0.0" + }, + "dependencies": { + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + } + } + }, "caller-path": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", @@ -2433,6 +2450,19 @@ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true }, + "cosmiconfig": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.1.0.tgz", + "integrity": "sha512-kCNPvthka8gvLtzAxQXvWo4FxqRB+ftRZyPZNuab5ngvM9Y7yw7hbEysglptLgpkGX9nAOKTBVkHUAe8xtYR6Q==", + "dev": true, + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.9.0", + "lodash.get": "^4.4.2", + "parse-json": "^4.0.0" + } + }, "coveralls": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.0.2.tgz", @@ -4254,6 +4284,12 @@ "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", "dev": true }, + "get-stdin": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", + "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", + "dev": true + }, "get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", @@ -4509,6 +4545,46 @@ "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", "dev": true }, + "husky": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/husky/-/husky-1.3.1.tgz", + "integrity": "sha512-86U6sVVVf4b5NYSZ0yvv88dRgBSSXXmHaiq5pP4KDj5JVzdwKgBjEtUPOm8hcoytezFwbU+7gotXNhpHdystlg==", + "dev": true, + "requires": { + "cosmiconfig": "^5.0.7", + "execa": "^1.0.0", + "find-up": "^3.0.0", + "get-stdin": "^6.0.0", + "is-ci": "^2.0.0", + "pkg-dir": "^3.0.0", + "please-upgrade-node": "^3.1.1", + "read-pkg": "^4.0.1", + "run-node": "^1.0.0", + "slash": "^2.0.0" + }, + "dependencies": { + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "read-pkg": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-4.0.1.tgz", + "integrity": "sha1-ljYlN48+HE1IyFhytabsfV0JMjc=", + "dev": true, + "requires": { + "normalize-package-data": "^2.3.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0" + } + } + } + }, "hyphenate-style-name": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.3.tgz", @@ -4536,6 +4612,33 @@ "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", "dev": true }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dev": true, + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + }, + "dependencies": { + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "dev": true, + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } + } + }, "import-local": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", @@ -4745,6 +4848,12 @@ } } }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dev": true + }, "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", @@ -5500,9 +5609,9 @@ "dev": true }, "js-yaml": { - "version": "3.12.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.2.tgz", - "integrity": "sha512-QHn/Lh/7HhZ/Twc7vJYQTkjuCa0kaCcDcjK5Zlk2rvnUpy7DxMJ23+Jc2dcyvltwQVg1nygAVlB2oRDFHoRS5Q==", + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.0.tgz", + "integrity": "sha512-pZZoSxcCYco+DIKBTimr67J6Hy+EYGZDY/HCWC+iAEA9h1ByhMXAIVUXMcMFpOCxQ/xjXmPI2MkDL5HRm5eFrQ==", "dev": true, "requires": { "argparse": "^1.0.7", @@ -5784,6 +5893,12 @@ "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=", "dev": true }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "dev": true + }, "lodash.kebabcase": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", @@ -6614,6 +6729,15 @@ } } }, + "please-upgrade-node": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.1.1.tgz", + "integrity": "sha512-KY1uHnQ2NlQHqIJQpnh/i54rKkuxCEBx+voJIS/Mvb+L2iYd2NMotwduhKTMjfC1uKoX3VXOxLjIYG66dfJTVQ==", + "dev": true, + "requires": { + "semver-compare": "^1.0.0" + } + }, "pluralize": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", @@ -7226,6 +7350,12 @@ "is-promise": "^2.1.0" } }, + "run-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/run-node/-/run-node-1.0.0.tgz", + "integrity": "sha512-kc120TBlQ3mih1LSzdAJXo4xn/GWS2ec0l3S+syHDXP9uRr0JAT8Qd3mdMuyjqCzeZktgP3try92cEgf9Nks8A==", + "dev": true + }, "rx-lite": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", @@ -7309,6 +7439,12 @@ "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", "dev": true }, + "semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", + "dev": true + }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", diff --git a/package.json b/package.json index 816b4ad..5760a52 100644 --- a/package.json +++ b/package.json @@ -52,11 +52,17 @@ "babel-polyfill": "6.26.0", "coveralls": "3.0.2", "eslint-config-mcrowder65": "0.0.45", + "husky": "1.3.1", "jest": "24.4.0", "jest-dom": "3.0.1", "react": "16.8.4", "react-dom": "16.8.4", "react-testing-library": "6.0.0" }, + "husky": { + "hooks": { + "pre-commit": "npm run build && npm test" + } + }, "babelConfig": ".babelrc.js" } From 1781cc120a921b54c9c1446bee9e53ac93f8e735 Mon Sep 17 00:00:00 2001 From: Matt Crowder Date: Thu, 21 Mar 2019 21:05:56 -0400 Subject: [PATCH 7/9] added travis --- .travis.yml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..efec953 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,14 @@ +language: node_js +node_js: 10.15.0 +cache: npm +script: + - npm run build + - npm run linter; + - npm run jest; + - npm run coveralls; +deploy: + provider: npm + email: "$NPM_EMAIL" + api_key: "$NPM_TOKEN" + on: + branch: master \ No newline at end of file From 1ddae6112e25502a1e2d3fc845a51b2c48fa563e Mon Sep 17 00:00:00 2001 From: Matt Crowder Date: Thu, 21 Mar 2019 21:06:39 -0400 Subject: [PATCH 8/9] 1.0.2 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1a9dffa..fa2172e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "mooks", - "version": "1.0.1", + "version": "1.0.2", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 5760a52..ce6ed3c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mooks", - "version": "1.0.1", + "version": "1.0.2", "description": "", "main": "src/index.js", "scripts": { From 0d38c4cd40cbc783bb95dacbdbdd536b4da70e24 Mon Sep 17 00:00:00 2001 From: Matt Crowder Date: Thu, 21 Mar 2019 21:06:58 -0400 Subject: [PATCH 9/9] main should be lib/index.js --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ce6ed3c..e163df4 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "mooks", "version": "1.0.2", "description": "", - "main": "src/index.js", + "main": "lib/index.js", "scripts": { "linter": "eslint src --ext .js", "jest": "jest --coverage --silent",