From 755f056abb59459c6bdf049ed46ef3f96161d8fc Mon Sep 17 00:00:00 2001 From: Senad Uka Date: Sun, 23 Jun 2019 19:38:26 +0200 Subject: [PATCH] Make navigation work --- app/controllers/homies_controller.rb | 3 +- client/package.json | 2 + client/public/index.html | 10 +- client/src/App.css | 14 +++ client/src/App.js | 50 ++++++---- client/src/RouteNames.js | 2 + client/src/cash/Cash.css | 7 ++ client/src/cash/Cash.js | 87 +++++++++++++++++ client/src/cash/MakeMoneyMove.js | 70 ++++++++++++++ client/src/common/RoutableNavItem.js | 19 ++++ client/src/index.css | 8 ++ client/yarn.lock | 42 +++++++- package.json | 5 + yarn.lock | 140 +++++++++++++++++++++++++++ 14 files changed, 437 insertions(+), 22 deletions(-) create mode 100644 client/src/RouteNames.js create mode 100644 client/src/cash/Cash.css create mode 100644 client/src/cash/Cash.js create mode 100644 client/src/cash/MakeMoneyMove.js create mode 100644 client/src/common/RoutableNavItem.js create mode 100644 package.json create mode 100644 yarn.lock diff --git a/app/controllers/homies_controller.rb b/app/controllers/homies_controller.rb index 51f1b35..57a1386 100644 --- a/app/controllers/homies_controller.rb +++ b/app/controllers/homies_controller.rb @@ -13,7 +13,8 @@ class HomiesController < ApplicationController end def cash - json_response(Homie.cash(params[:importance])) + importance = params[:importance].to_i + json_response(Homie.cash(importance)) end private diff --git a/client/package.json b/client/package.json index 48da596..3386786 100644 --- a/client/package.json +++ b/client/package.json @@ -4,8 +4,10 @@ "private": true, "proxy": "http://localhost:3001", "dependencies": { + "axios": "^0.19.0", "react": "^16.8.6", "react-dom": "^16.8.6", + "react-materialize": "^3.3.1", "react-scripts": "3.0.1" }, "scripts": { diff --git a/client/public/index.html b/client/public/index.html index dd1ccfd..b209ea0 100644 --- a/client/public/index.html +++ b/client/public/index.html @@ -19,7 +19,15 @@ work correctly both with client-side routing and a non-root public URL. Learn how to configure a non-root public URL by running `npm run build`. --> - React App + + + + + + + + + Gangsta Keeping Score diff --git a/client/src/App.css b/client/src/App.css index b41d297..dbc9bb3 100644 --- a/client/src/App.css +++ b/client/src/App.css @@ -31,3 +31,17 @@ transform: rotate(360deg); } } + +#root, .main-tab { + height: 100%; + width: 100%; +} + +.noscrolling { + overflow: hidden; +} + +.autoscroling { + overflow: auto; +} + diff --git a/client/src/App.js b/client/src/App.js index ce9cbd2..758bd0c 100644 --- a/client/src/App.js +++ b/client/src/App.js @@ -1,25 +1,41 @@ import React from 'react'; -import logo from './logo.svg'; import './App.css'; +import { Tabs, Tab, Navbar } from 'react-materialize'; +import MakeMoneyMove from './cash/MakeMoneyMove'; +import Cash from './cash/Cash'; +import { BrowserRouter as Router, Route, Link } from "react-router-dom"; +import RoutableNavItem from './common/RoutableNavItem'; +import { + CRIB, + MAKE_MONEY_MOVE +} from './RouteNames'; function App() { + return ( -
-
- logo -

- Edit src/App.js and save to reload. -

- - Learn React - -
-
+ + + GKS} alignLinks="right"> + + + Crib + + + + Homies + + + + Make Money Move + + + + +
+ + +
+
); } diff --git a/client/src/RouteNames.js b/client/src/RouteNames.js new file mode 100644 index 0000000..0c997a0 --- /dev/null +++ b/client/src/RouteNames.js @@ -0,0 +1,2 @@ +export const CRIB = '/'; +export const MAKE_MONEY_MOVE = '/make-money-move'; diff --git a/client/src/cash/Cash.css b/client/src/cash/Cash.css new file mode 100644 index 0000000..d31cd9f --- /dev/null +++ b/client/src/cash/Cash.css @@ -0,0 +1,7 @@ +.cash-cell-left { + text-align: left; +} + +.cash-cell-right { + text-align: right; +} diff --git a/client/src/cash/Cash.js b/client/src/cash/Cash.js new file mode 100644 index 0000000..9502c82 --- /dev/null +++ b/client/src/cash/Cash.js @@ -0,0 +1,87 @@ +import React, { useState, useEffect } from 'react'; +import { Button, Table } from 'react-materialize'; +import './Cash.css'; +import axios from 'axios'; +import { Link } from 'react-router-dom'; +import { MAKE_MONEY_MOVE } from '../RouteNames'; +import { withRouter } from 'react-router-dom'; + +const Cash = (props) => { + const [homiesCash, setHomiesCash] = useState([]); + //const [importance, setImportance] = useState(10); + + useEffect( () => { + const getCashForHomies = async () => { + try { + const cash = await axios.get(`/homies/cash`); + setHomiesCash(cash.data); + } catch (e) { + console.log("Error fetching", e); + } + }; + getCashForHomies(); + }, []); + + + const formatMoney = (amount) => { + const formatted = Number.parseFloat(amount).toFixed(2); + return `${formatted} KM`; + } + + const cashTableBody = homiesCash.map( (homieLine) => { + return ( + + + { homieLine.homie.name } + + + { formatMoney(homieLine.amount) } + + + [ settle ] + + + ); + }); + + return ( +
+ + + + + + + + + + + { cashTableBody } + +
+ Homie + + Cash + + Actions +
+ +
+ ); +} + + +export default withRouter(Cash); diff --git a/client/src/cash/MakeMoneyMove.js b/client/src/cash/MakeMoneyMove.js new file mode 100644 index 0000000..e8fc55d --- /dev/null +++ b/client/src/cash/MakeMoneyMove.js @@ -0,0 +1,70 @@ +import React, { useState, useEffect } from 'react'; +import { Modal, Select, TextInput, Collection, CollectionItem } from 'react-materialize'; +import './Cash.css'; +import axios from 'axios'; + +const MakeMoneyMove = (props) => { + + const [selectedFrom, setSelectedFrom] = useState(null); + +return ( +
+ + + + + Alvin + + + Alvin + + + Alvin + + + Alvin + + + Alvin + + + Alvin + + + Alvin + + + Alvin + + + Alvin + + + Alvin + + + Alvin + + + Alvin + + + Alvin + + + Alvin + + + Alvin + + + Alvin + + + +
+); + +} + +export default MakeMoneyMove; diff --git a/client/src/common/RoutableNavItem.js b/client/src/common/RoutableNavItem.js new file mode 100644 index 0000000..b869c54 --- /dev/null +++ b/client/src/common/RoutableNavItem.js @@ -0,0 +1,19 @@ +import React from 'react'; +import { Navbar, NavItem } from 'react-materialize'; +import { withRouter } from 'react-router-dom'; + +const RoutableNavItem = (props) => { + return ( + { + props.history.push(props.href); + } + }> + { props.children } + + ); +} + +export default withRouter(RoutableNavItem); + + diff --git a/client/src/index.css b/client/src/index.css index 4a1df4d..1e4e3e9 100644 --- a/client/src/index.css +++ b/client/src/index.css @@ -7,7 +7,15 @@ body { -moz-osx-font-smoothing: grayscale; } +html, body { + margin: 0; + height: 100%; + width: 100%; + +} code { font-family: source-code-pro, Menlo, Monaco, Consolas, "Courier New", monospace; } + + diff --git a/client/yarn.lock b/client/yarn.lock index d9a1d3f..9e7f0d2 100644 --- a/client/yarn.lock +++ b/client/yarn.lock @@ -1813,6 +1813,14 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== +axios@^0.19.0: + version "0.19.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.19.0.tgz#8e09bff3d9122e133f7b8101c8fbdd00ed3d2ab8" + integrity sha512-1uvKqKQta3KBxIz14F2v06AEHZ/dIoeKfbTRkK1E5oqjDnuEerLmYTgJB5AiQZHJcljpg1TuRzdjDR06qNk0DQ== + dependencies: + follow-redirects "1.5.10" + is-buffer "^2.0.2" + axobject-query@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.0.2.tgz#ea187abe5b9002b377f925d8bf7d1c561adf38f9" @@ -2421,6 +2429,11 @@ class-utils@^0.3.5: isobject "^3.0.0" static-extend "^0.1.1" +classnames@^2.2.5: + version "2.2.6" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce" + integrity sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q== + clean-css@4.2.x: version "4.2.1" resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.1.tgz#2d411ef76b8569b6d0c84068dabe85b0aa5e5c17" @@ -3040,6 +3053,13 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.8, debug@^2.6. dependencies: ms "2.0.0" +debug@=3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== + dependencies: + ms "2.0.0" + debug@^3.2.5, debug@^3.2.6: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" @@ -3998,6 +4018,13 @@ flush-write-stream@^1.0.0: inherits "^2.0.3" readable-stream "^2.3.6" +follow-redirects@1.5.10: + version "1.5.10" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.10.tgz#7b7a9f9aea2fdff36786a94ff643ed07f4ff5e2a" + integrity sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ== + dependencies: + debug "=3.1.0" + follow-redirects@^1.0.0: version "1.7.0" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.7.0.tgz#489ebc198dc0e7f64167bd23b03c4c19b5784c76" @@ -4818,7 +4845,7 @@ is-buffer@^1.0.2, is-buffer@^1.1.5: resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== -is-buffer@^2.0.0: +is-buffer@^2.0.0, is-buffer@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.3.tgz#4ecf3fcf749cbd1e472689e109ac66261a25e725" integrity sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw== @@ -7846,7 +7873,7 @@ react-dev-utils@^9.0.1: strip-ansi "5.2.0" text-table "0.2.0" -react-dom@^16.8.6: +react-dom@^16.8.5, react-dom@^16.8.6: version "16.8.6" resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.8.6.tgz#71d6303f631e8b0097f56165ef608f051ff6e10f" integrity sha512-1nL7PIq9LTL3fthPqwkvr2zY7phIPjYrT0jp4HjyEQrEROnw4dG41VVwi/wfoCneoleqrNX7iAD+pXebJZwrwA== @@ -7866,6 +7893,15 @@ react-is@^16.8.1, react-is@^16.8.4: resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.8.6.tgz#5bbc1e2d29141c9fbdfed456343fe2bc430a6a16" integrity sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA== +react-materialize@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/react-materialize/-/react-materialize-3.3.1.tgz#aa928d6002a54db651eb359c94c9de3e5fa74c92" + integrity sha512-w2mbBYujUuNsrmxB98GgaZEFmmuSwyQojgECjy6qADU9QSRjJNwcYFb/MjJAAC1hQ3DtVfLZ/SfBOZfC8LlqRg== + dependencies: + classnames "^2.2.5" + react "^16.8.5" + react-dom "^16.8.5" + react-scripts@3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/react-scripts/-/react-scripts-3.0.1.tgz#e5565350d8069cc9966b5998d3fe3befe3d243ac" @@ -7926,7 +7962,7 @@ react-scripts@3.0.1: optionalDependencies: fsevents "2.0.6" -react@^16.8.6: +react@^16.8.5, react@^16.8.6: version "16.8.6" resolved "https://registry.yarnpkg.com/react/-/react-16.8.6.tgz#ad6c3a9614fd3a4e9ef51117f54d888da01f2bbe" integrity sha512-pC0uMkhLaHm11ZSJULfOBqV4tIZkx87ZLvbbQYunNixAAvjnC+snJCg0XQXn9VIsttVsbZP/H/ewzgsd5fxKXw== diff --git a/package.json b/package.json new file mode 100644 index 0000000..e49a089 --- /dev/null +++ b/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "react-router-dom": "^5.0.1" + } +} diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..f43ac5f --- /dev/null +++ b/yarn.lock @@ -0,0 +1,140 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/runtime@^7.1.2", "@babel/runtime@^7.4.0": + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.4.5.tgz#582bb531f5f9dc67d2fcb682979894f75e253f12" + integrity sha512-TuI4qpWZP6lGOGIuGWtp9sPluqYICmbk8T/1vpSysqJxRPkudh/ofFWyqdcMsDf2s7KvDL4/YHgKyvcS3g9CJQ== + dependencies: + regenerator-runtime "^0.13.2" + +gud@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/gud/-/gud-1.0.0.tgz#a489581b17e6a70beca9abe3ae57de7a499852c0" + integrity sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw== + +history@^4.9.0: + version "4.9.0" + resolved "https://registry.yarnpkg.com/history/-/history-4.9.0.tgz#84587c2068039ead8af769e9d6a6860a14fa1bca" + integrity sha512-H2DkjCjXf0Op9OAr6nJ56fcRkTSNrUiv41vNJ6IswJjif6wlpZK0BTfFbi7qK9dXLSYZxkq5lBsj3vUjlYBYZA== + dependencies: + "@babel/runtime" "^7.1.2" + loose-envify "^1.2.0" + resolve-pathname "^2.2.0" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + value-equal "^0.4.0" + +hoist-non-react-statics@^3.1.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.0.tgz#b09178f0122184fb95acf525daaecb4d8f45958b" + integrity sha512-0XsbTXxgiaCDYDIWFcwkmerZPSwywfUqYmwT4jzewKTQSWoE6FCMoUVOeBJWK3E/CrWbxRG3m5GzY4lnIwGRBA== + dependencies: + react-is "^16.7.0" + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= + +"js-tokens@^3.0.0 || ^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +mini-create-react-context@^0.3.0: + version "0.3.2" + resolved "https://registry.yarnpkg.com/mini-create-react-context/-/mini-create-react-context-0.3.2.tgz#79fc598f283dd623da8e088b05db8cddab250189" + integrity sha512-2v+OeetEyliMt5VHMXsBhABoJ0/M4RCe7fatd/fBy6SMiKazUSEt3gxxypfnk2SHMkdBYvorHRoQxuGoiwbzAw== + dependencies: + "@babel/runtime" "^7.4.0" + gud "^1.0.0" + tiny-warning "^1.0.2" + +object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +path-to-regexp@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.7.0.tgz#59fde0f435badacba103a84e9d3bc64e96b9937d" + integrity sha1-Wf3g9DW62suhA6hOnTvGTpa5k30= + dependencies: + isarray "0.0.1" + +prop-types@^15.6.2: + version "15.7.2" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" + integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.8.1" + +react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1: + version "16.8.6" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.8.6.tgz#5bbc1e2d29141c9fbdfed456343fe2bc430a6a16" + integrity sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA== + +react-router-dom@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.0.1.tgz#ee66f4a5d18b6089c361958e443489d6bab714be" + integrity sha512-zaVHSy7NN0G91/Bz9GD4owex5+eop+KvgbxXsP/O+iW1/Ln+BrJ8QiIR5a6xNPtrdTvLkxqlDClx13QO1uB8CA== + dependencies: + "@babel/runtime" "^7.1.2" + history "^4.9.0" + loose-envify "^1.3.1" + prop-types "^15.6.2" + react-router "5.0.1" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + +react-router@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.0.1.tgz#04ee77df1d1ab6cb8939f9f01ad5702dbadb8b0f" + integrity sha512-EM7suCPNKb1NxcTZ2LEOWFtQBQRQXecLxVpdsP4DW4PbbqYWeRiLyV/Tt1SdCrvT2jcyXAXmVTmzvSzrPR63Bg== + dependencies: + "@babel/runtime" "^7.1.2" + history "^4.9.0" + hoist-non-react-statics "^3.1.0" + loose-envify "^1.3.1" + mini-create-react-context "^0.3.0" + path-to-regexp "^1.7.0" + prop-types "^15.6.2" + react-is "^16.6.0" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + +regenerator-runtime@^0.13.2: + version "0.13.2" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz#32e59c9a6fb9b1a4aff09b4930ca2d4477343447" + integrity sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA== + +resolve-pathname@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-2.2.0.tgz#7e9ae21ed815fd63ab189adeee64dc831eefa879" + integrity sha512-bAFz9ld18RzJfddgrO2e/0S2O81710++chRMUxHjXOYKF6jTAMrUNZrEZ1PvV0zlhfjidm08iRPdTLPno1FuRg== + +tiny-invariant@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.0.4.tgz#346b5415fd93cb696b0c4e8a96697ff590f92463" + integrity sha512-lMhRd/djQJ3MoaHEBrw8e2/uM4rs9YMNk0iOr8rHQ0QdbM7D4l0gFl3szKdeixrlyfm9Zqi4dxHCM2qVG8ND5g== + +tiny-warning@^1.0.0, tiny-warning@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.2.tgz#1dfae771ee1a04396bdfde27a3adcebc6b648b28" + integrity sha512-rru86D9CpQRLvsFG5XFdy0KdLAvjdQDyZCsRcuu60WtzFylDM3eAWSxEVz5kzL2Gp544XiUvPbVKtOA/txLi9Q== + +value-equal@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-0.4.0.tgz#c5bdd2f54ee093c04839d71ce2e4758a6890abc7" + integrity sha512-x+cYdNnaA3CxvMaTX0INdTCN8m8aF2uY9BvEqmxuYp8bL09cs/kWVQPVGcA35fMktdOsP69IgU7wFj/61dJHEw==