From 3c3d2862d3001505f5c451a2e89b020b2717f2c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Geonizeli?= Date: Sun, 15 Aug 2021 12:51:09 -0300 Subject: [PATCH] fix eslint and types --- .eslintrc | 2 +- app/graphql/types/query_type.rb | 4 +- app/graphql/x_stake_schema.rb | 4 + app/javascript/__generated__/schema.graphql | 25 +++--- app/javascript/src/App.tsx | 6 +- .../src/__generated__/AppQuery.graphql.ts | 40 +++++---- app/javascript/src/components/Poo.tsx | 6 +- app/javascript/src/components/PoolListing.tsx | 4 +- app/javascript/src/constants/index.ts | 2 +- app/javascript/src/contexts/BscProvider.tsx | 5 +- app/javascript/src/contexts/UserProvider.tsx | 42 +++++++-- .../UserProvider_user.graphql.ts | 37 ++++++++ .../src/pages/Wallet/FiatBalances.tsx | 1 - .../FiatBalances_fiatBalances.graphql.ts | 10 +-- .../__generated__/WalletQuery.graphql.ts | 10 +-- app/javascript/src/utils/apr.ts | 2 +- app/javascript/src/utils/getPrice.ts | 6 +- app/javascript/src/utils/getTotalStaked.ts | 3 +- app/policies/buy_crypto_order_policy.rb | 10 +++ app/policies/sell_crypto_order_policy.rb | 10 +++ package.json | 8 +- yarn.lock | 89 +++++++++++++++++++ 22 files changed, 255 insertions(+), 71 deletions(-) create mode 100644 app/javascript/src/contexts/__generated__/UserProvider_user.graphql.ts create mode 100644 app/policies/buy_crypto_order_policy.rb create mode 100644 app/policies/sell_crypto_order_policy.rb diff --git a/.eslintrc b/.eslintrc index bea5ba5..cda8cf2 100644 --- a/.eslintrc +++ b/.eslintrc @@ -11,7 +11,7 @@ } ], "rules": { - "relay/generated-flow-types": "false" + "relay/generated-flow-types": "off" }, "plugins": ["relay"] } diff --git a/app/graphql/types/query_type.rb b/app/graphql/types/query_type.rb index 480509a..f83b3c6 100644 --- a/app/graphql/types/query_type.rb +++ b/app/graphql/types/query_type.rb @@ -21,12 +21,12 @@ module Types field :sell_crypto_orders, SellCryptoOrderType.connection_type, null: false def sell_crypto_orders - [] + Pundit.policy_scope(current_user, SellCryptoOrder) end field :buy_crypto_orders, BuyCryptoOrderType.connection_type, null: false def buy_crypto_orders - [] + Pundit.policy_scope(current_user, BuyCryptoOrder) end end end diff --git a/app/graphql/x_stake_schema.rb b/app/graphql/x_stake_schema.rb index e7c28a0..f3dab93 100644 --- a/app/graphql/x_stake_schema.rb +++ b/app/graphql/x_stake_schema.rb @@ -12,6 +12,10 @@ class XStakeSchema < GraphQL::Schema Types::BalanceType when FiatBalance Types::FiatBalanceType + when SellCryptoOrder + Types::SellCryptoOrderType + when BuyCryptoOrder + Types::BuyCryptoOrderType else raise(GraphQL::RequiredImplementationMissingError, "Unexpected object: #{obj}") end diff --git a/app/javascript/__generated__/schema.graphql b/app/javascript/__generated__/schema.graphql index 16763b3..4c9fca0 100644 --- a/app/javascript/__generated__/schema.graphql +++ b/app/javascript/__generated__/schema.graphql @@ -39,7 +39,7 @@ type BuyCryptoOrder implements Node { currency: Currency! id: ID! paidAmountCents: Int! - receivedAmount: Float + receivedAmount: String status: ProcessStatus! updatedAt: ISO8601DateTime! } @@ -78,7 +78,7 @@ input CreateBuyCryptoOrderAttributesInput { """ Amount to be paid """ - amount: Float! + amountCents: Int! currencyId: ID! } @@ -105,15 +105,15 @@ type CreateBuyCryptoOrderPayload { """ Errors encountered during execution of the mutation. """ - errors: [String!] - order: BuyCryptoOrder! + errors: [RecordInvalid!] + order: BuyCryptoOrder } input CreateSellCryptoOrderAttributesInput { """ Amount to be paid """ - amount: Float! + amount: String! currencyId: ID! } @@ -140,8 +140,8 @@ type CreateSellCryptoOrderPayload { """ Errors encountered during execution of the mutation. """ - errors: [String!] - order: SellCryptoOrder! + errors: [RecordInvalid!] + order: SellCryptoOrder } type Currency implements Node { @@ -152,9 +152,7 @@ type Currency implements Node { type FiatBalance implements Node { amountCents: Int! amountCurrency: String! - createdAt: ISO8601DateTime! id: ID! - updatedAt: ISO8601DateTime! } """ @@ -356,11 +354,18 @@ type Query { ): SellCryptoOrderConnection! } +type RecordInvalid { + fieldName: String + fullMessages: [String!]! + messages: [String!] + path: [String!] +} + type SellCryptoOrder implements Node { createdAt: ISO8601DateTime! currency: Currency! id: ID! - paidAmount: Float! + paidAmount: String! receivedAmountCents: Int status: ProcessStatus! updatedAt: ISO8601DateTime! diff --git a/app/javascript/src/App.tsx b/app/javascript/src/App.tsx index b608234..cb55841 100644 --- a/app/javascript/src/App.tsx +++ b/app/javascript/src/App.tsx @@ -10,11 +10,11 @@ import { Routes } from "./Routes"; import type { AppQuery } from "./__generated__/AppQuery.graphql"; export const App: FC = () => { - const { currentUser } = useLazyLoadQuery( + const data = useLazyLoadQuery( graphql` query AppQuery { currentUser { - firstName + ...UserProvider_user } } `, @@ -23,7 +23,7 @@ export const App: FC = () => { return ( - +
diff --git a/app/javascript/src/__generated__/AppQuery.graphql.ts b/app/javascript/src/__generated__/AppQuery.graphql.ts index 59c4f9e..1a9ad9b 100644 --- a/app/javascript/src/__generated__/AppQuery.graphql.ts +++ b/app/javascript/src/__generated__/AppQuery.graphql.ts @@ -3,10 +3,11 @@ // @ts-nocheck import { ConcreteRequest } from "relay-runtime"; +import { FragmentRefs } from "relay-runtime"; export type AppQueryVariables = {}; export type AppQueryResponse = { readonly currentUser: { - readonly firstName: string; + readonly " $fragmentRefs": FragmentRefs<"UserProvider_user">; } | null; }; export type AppQuery = { @@ -19,21 +20,17 @@ export type AppQuery = { /* query AppQuery { currentUser { - firstName + ...UserProvider_user id } } + +fragment UserProvider_user on User { + firstName +} */ -const node: ConcreteRequest = (function(){ -var v0 = { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "firstName", - "storageKey": null -}; -return { +const node: ConcreteRequest = { "fragment": { "argumentDefinitions": [], "kind": "Fragment", @@ -48,7 +45,11 @@ return { "name": "currentUser", "plural": false, "selections": [ - (v0/*: any*/) + { + "args": null, + "kind": "FragmentSpread", + "name": "UserProvider_user" + } ], "storageKey": null } @@ -70,7 +71,13 @@ return { "name": "currentUser", "plural": false, "selections": [ - (v0/*: any*/), + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "firstName", + "storageKey": null + }, { "alias": null, "args": null, @@ -84,14 +91,13 @@ return { ] }, "params": { - "cacheID": "ecf2bf1a08ead5c3e2edb202242ed8cf", + "cacheID": "ce9692d3fdea00e7368e2a6404748f16", "id": null, "metadata": {}, "name": "AppQuery", "operationKind": "query", - "text": "query AppQuery {\n currentUser {\n firstName\n id\n }\n}\n" + "text": "query AppQuery {\n currentUser {\n ...UserProvider_user\n id\n }\n}\n\nfragment UserProvider_user on User {\n firstName\n}\n" } }; -})(); -(node as any).hash = 'ea65c9caf86d93b8ddded2ae3eaa7b0e'; +(node as any).hash = 'aac57a65620cf50754d54f3c8d6495cf'; export default node; diff --git a/app/javascript/src/components/Poo.tsx b/app/javascript/src/components/Poo.tsx index 5e3bbd9..d6254b5 100644 --- a/app/javascript/src/components/Poo.tsx +++ b/app/javascript/src/components/Poo.tsx @@ -1,5 +1,4 @@ import React from "react"; -import BigNumber from "bignumber.js"; import type { PoolConfig } from "../types"; import { useBsc } from "../contexts/BscProvider"; @@ -32,6 +31,7 @@ export const Pool = ({ pool }: PoolProps) => { const totalStaked = await getTotalStaked(provider, pool); + // eslint-disable-next-line no-console console.log( `Total Staked for ${pool.stakingToken.symbol} - ${ pool.earningToken.symbol @@ -52,7 +52,7 @@ export const Pool = ({ pool }: PoolProps) => { }); } })(); - }, []); + }, [pool, provider, router]); return (
{
); -}; \ No newline at end of file +}; diff --git a/app/javascript/src/components/PoolListing.tsx b/app/javascript/src/components/PoolListing.tsx index 1a98646..56f4aed 100644 --- a/app/javascript/src/components/PoolListing.tsx +++ b/app/javascript/src/components/PoolListing.tsx @@ -9,7 +9,9 @@ export const PoolListing = () => { {pools .filter((pool) => !pool.isFinished) .sort((a, b) => (a.sortOrder ?? 0) - (b.sortOrder ?? 0)) - .map((pool) => )} + .map((pool) => ( + + ))} ); }; diff --git a/app/javascript/src/constants/index.ts b/app/javascript/src/constants/index.ts index 919384c..846c142 100644 --- a/app/javascript/src/constants/index.ts +++ b/app/javascript/src/constants/index.ts @@ -3,4 +3,4 @@ import BigNumber from "bignumber.js"; export const BSC_BLOCK_TIME = 3; export const BLOCKS_PER_YEAR = new BigNumber( (60 / BSC_BLOCK_TIME) * 60 * 24 * 365 -); \ No newline at end of file +); diff --git a/app/javascript/src/contexts/BscProvider.tsx b/app/javascript/src/contexts/BscProvider.tsx index 5f84e23..36b5159 100644 --- a/app/javascript/src/contexts/BscProvider.tsx +++ b/app/javascript/src/contexts/BscProvider.tsx @@ -1,3 +1,4 @@ +import type { FC } from "react"; import React, { useContext } from "react"; import { ethers } from "ethers"; @@ -37,7 +38,7 @@ export const useBsc = () => { return context; }; -export const BscProvider = ({ children }: React.PropsWithChildren) => { +export const BscProvider: FC = ({ children }) => { const value: BscContext = { provider, pancake: { @@ -46,4 +47,4 @@ export const BscProvider = ({ children }: React.PropsWithChildren) => { }; return {children}; -}; \ No newline at end of file +}; diff --git a/app/javascript/src/contexts/UserProvider.tsx b/app/javascript/src/contexts/UserProvider.tsx index 157fb7a..ab60bfe 100644 --- a/app/javascript/src/contexts/UserProvider.tsx +++ b/app/javascript/src/contexts/UserProvider.tsx @@ -1,9 +1,13 @@ import type { FC } from "react"; import React, { createContext, useContext } from "react"; +import { useFragment } from "react-relay"; +import { graphql } from "babel-plugin-relay/macro"; + +import type { UserProvider_user$key } from "./__generated__/UserProvider_user.graphql"; type CurrentUserContext = { user: { - readonly firstName: string; + firstName: string; } | null; isAuthenticated: boolean; }; @@ -20,13 +24,33 @@ export const useCurrentUser = (): CurrentUserContext => { }; type Props = { - user: { - readonly firstName: string; - } | null; + userRef: UserProvider_user$key | null; }; -export const UserProvider: FC = ({ user, children }) => ( - - {children} - -); +export const UserProvider: FC = ({ userRef, children }) => { + const userData = useFragment( + graphql` + fragment UserProvider_user on User { + firstName + } + `, + userRef + ); + + const user = userData + ? { + firstName: userData.firstName, + } + : null; + + return ( + + {children} + + ); +}; diff --git a/app/javascript/src/contexts/__generated__/UserProvider_user.graphql.ts b/app/javascript/src/contexts/__generated__/UserProvider_user.graphql.ts new file mode 100644 index 0000000..5520642 --- /dev/null +++ b/app/javascript/src/contexts/__generated__/UserProvider_user.graphql.ts @@ -0,0 +1,37 @@ +/* tslint:disable */ +/* eslint-disable */ +// @ts-nocheck + +import { ReaderFragment } from "relay-runtime"; +import { FragmentRefs } from "relay-runtime"; +export type UserProvider_user = { + readonly firstName: string; + readonly " $refType": "UserProvider_user"; +}; +export type UserProvider_user$data = UserProvider_user; +export type UserProvider_user$key = { + readonly " $data"?: UserProvider_user$data; + readonly " $fragmentRefs": FragmentRefs<"UserProvider_user">; +}; + + + +const node: ReaderFragment = { + "argumentDefinitions": [], + "kind": "Fragment", + "metadata": null, + "name": "UserProvider_user", + "selections": [ + { + "alias": null, + "args": null, + "kind": "ScalarField", + "name": "firstName", + "storageKey": null + } + ], + "type": "User", + "abstractKey": null +}; +(node as any).hash = '352cdd208485d062f3f7c2e22e287a99'; +export default node; diff --git a/app/javascript/src/pages/Wallet/FiatBalances.tsx b/app/javascript/src/pages/Wallet/FiatBalances.tsx index e754ddc..c6fa6d4 100644 --- a/app/javascript/src/pages/Wallet/FiatBalances.tsx +++ b/app/javascript/src/pages/Wallet/FiatBalances.tsx @@ -14,7 +14,6 @@ export const FiatBalances: FC = ({ fiatBalancesRef }) => { fragment FiatBalances_fiatBalances on FiatBalanceConnection { edges { node { - id amountCents amountCurrency } diff --git a/app/javascript/src/pages/Wallet/__generated__/FiatBalances_fiatBalances.graphql.ts b/app/javascript/src/pages/Wallet/__generated__/FiatBalances_fiatBalances.graphql.ts index 58d9fe6..a0e22c0 100644 --- a/app/javascript/src/pages/Wallet/__generated__/FiatBalances_fiatBalances.graphql.ts +++ b/app/javascript/src/pages/Wallet/__generated__/FiatBalances_fiatBalances.graphql.ts @@ -7,7 +7,6 @@ import { FragmentRefs } from "relay-runtime"; export type FiatBalances_fiatBalances = { readonly edges: ReadonlyArray<{ readonly node: { - readonly id: string; readonly amountCents: number; readonly amountCurrency: string; }; @@ -44,13 +43,6 @@ const node: ReaderFragment = { "name": "node", "plural": false, "selections": [ - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "id", - "storageKey": null - }, { "alias": null, "args": null, @@ -75,5 +67,5 @@ const node: ReaderFragment = { "type": "FiatBalanceConnection", "abstractKey": null }; -(node as any).hash = '106c8efa69b9cde5af510a15c2493ba6'; +(node as any).hash = 'a1454d1a8afc3cffb17cbfbe9e3555f7'; export default node; diff --git a/app/javascript/src/pages/Wallet/__generated__/WalletQuery.graphql.ts b/app/javascript/src/pages/Wallet/__generated__/WalletQuery.graphql.ts index 5d8deb2..6854bd6 100644 --- a/app/javascript/src/pages/Wallet/__generated__/WalletQuery.graphql.ts +++ b/app/javascript/src/pages/Wallet/__generated__/WalletQuery.graphql.ts @@ -46,9 +46,9 @@ fragment Balances_balances on BalanceConnection { fragment FiatBalances_fiatBalances on FiatBalanceConnection { edges { node { - id amountCents amountCurrency + id } } } @@ -135,7 +135,6 @@ return { "name": "node", "plural": false, "selections": [ - (v0/*: any*/), { "alias": null, "args": null, @@ -149,7 +148,8 @@ return { "kind": "ScalarField", "name": "amountCurrency", "storageKey": null - } + }, + (v0/*: any*/) ], "storageKey": null } @@ -222,12 +222,12 @@ return { ] }, "params": { - "cacheID": "3c87fba4bacbbbe14fd4b584bfb1f7bb", + "cacheID": "6acfc80d1e8d7c882a03e25cc7902d72", "id": null, "metadata": {}, "name": "WalletQuery", "operationKind": "query", - "text": "query WalletQuery {\n fiatBalances {\n ...FiatBalances_fiatBalances\n }\n balances {\n ...Balances_balances\n }\n}\n\nfragment Balances_balances on BalanceConnection {\n edges {\n node {\n id\n amount\n currency {\n name\n id\n }\n }\n }\n}\n\nfragment FiatBalances_fiatBalances on FiatBalanceConnection {\n edges {\n node {\n id\n amountCents\n amountCurrency\n }\n }\n}\n" + "text": "query WalletQuery {\n fiatBalances {\n ...FiatBalances_fiatBalances\n }\n balances {\n ...Balances_balances\n }\n}\n\nfragment Balances_balances on BalanceConnection {\n edges {\n node {\n id\n amount\n currency {\n name\n id\n }\n }\n }\n}\n\nfragment FiatBalances_fiatBalances on FiatBalanceConnection {\n edges {\n node {\n amountCents\n amountCurrency\n id\n }\n }\n}\n" } }; })(); diff --git a/app/javascript/src/utils/apr.ts b/app/javascript/src/utils/apr.ts index deb55dc..295d5ab 100644 --- a/app/javascript/src/utils/apr.ts +++ b/app/javascript/src/utils/apr.ts @@ -19,4 +19,4 @@ export const getApr = ( const apr = totalRewardPricePerYear.div(totalStakingTokenInPool).times(100); return apr.isNaN() || !apr.isFinite() ? null : apr.toNumber(); -}; \ No newline at end of file +}; diff --git a/app/javascript/src/utils/getPrice.ts b/app/javascript/src/utils/getPrice.ts index 3676340..2b3e118 100644 --- a/app/javascript/src/utils/getPrice.ts +++ b/app/javascript/src/utils/getPrice.ts @@ -1,13 +1,13 @@ +import type { Contract } from "ethers"; import { ethers } from "ethers"; import { tokens } from "../constants/pancake/Tokens"; import type { Token } from "../constants/pancake/Tokens"; -import type { BscContext } from "../contexts/BscProvider"; // 1 Wei = 1*10^18 Ether const ONE_BUSD_IN_WEI = ethers.utils.parseUnits("1", 18); -export const getPriceInBusd = async (router: any, token: Token) => { +export const getPriceInBusd = async (router: Contract, token: Token) => { try { const result = await router.getAmountsOut(ONE_BUSD_IN_WEI, [ token.address["56"], @@ -18,4 +18,4 @@ export const getPriceInBusd = async (router: any, token: Token) => { } catch { return 0; } -}; \ No newline at end of file +}; diff --git a/app/javascript/src/utils/getTotalStaked.ts b/app/javascript/src/utils/getTotalStaked.ts index 427928f..9b06589 100644 --- a/app/javascript/src/utils/getTotalStaked.ts +++ b/app/javascript/src/utils/getTotalStaked.ts @@ -2,7 +2,6 @@ import { ethers } from "ethers"; import BigNumber from "bignumber.js"; import erc20 from "../abi/erc20.json"; -import { Token } from "../constants/pancake/Tokens"; import type { PoolConfig } from "../types"; export const getTotalStaked = async ( @@ -27,4 +26,4 @@ export const getTotalStaked = async ( } catch { return 0; } -}; \ No newline at end of file +}; diff --git a/app/policies/buy_crypto_order_policy.rb b/app/policies/buy_crypto_order_policy.rb new file mode 100644 index 0000000..89959a0 --- /dev/null +++ b/app/policies/buy_crypto_order_policy.rb @@ -0,0 +1,10 @@ +# frozen_string_literal: true +class BuyCryptoOrderPolicy < ApplicationPolicy + class Scope < Scope + def resolve + return scope.none if user.nil? + + scope.where(user_id: user.id) + end + end +end diff --git a/app/policies/sell_crypto_order_policy.rb b/app/policies/sell_crypto_order_policy.rb new file mode 100644 index 0000000..55d88fc --- /dev/null +++ b/app/policies/sell_crypto_order_policy.rb @@ -0,0 +1,10 @@ +# frozen_string_literal: true +class SellCryptoOrderPolicy < ApplicationPolicy + class Scope < Scope + def resolve + return scope.none if user.nil? + + scope.where(user_id: user.id) + end + end +end diff --git a/package.json b/package.json index 2adbab3..5c1b748 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,7 @@ { "name": "x-stake", "private": true, + "version": "0.1.0", "scripts": { "dev": "./bin/webpack-dev-server", "lint": "eslint --ext .jsx,.js,.tsx,.ts app/javascript/", @@ -9,6 +10,11 @@ "relay": "relay-compiler --schema app/javascript/__generated__/schema.graphql --src app/javascript/src --extensions tsx --language typescript", "relay:watch": "relay-compiler --schema app/javascript/__generated__/schema.graphql --src app/javascript/src --extensions tsx --language typescript --watch" }, + "husky": { + "hooks": { + "pre-commit": "yarn lint:fix" + } + }, "dependencies": { "@babel/preset-react": "^7.14.5", "@babel/preset-typescript": "^7.14.5", @@ -39,7 +45,6 @@ "webpack": "^4.46.0", "webpack-cli": "^3.3.12" }, - "version": "0.1.0", "devDependencies": { "@types/ramda": "^0.27.44", "@types/react-relay": "^11.0.2", @@ -50,6 +55,7 @@ "eslint-config-vtex-react": "^8.1.0", "eslint-plugin-relay": "^1.8.2", "graphql": "^15.5.1", + "husky": "^4.2.1", "prettier": "^2.3.2", "relay-compiler": "^11.0.2", "relay-compiler-language-typescript": "^14.0.0", diff --git a/yarn.lock b/yarn.lock index e4b39d3..175de3a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2784,6 +2784,11 @@ chrome-trace-event@^1.0.2: resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" @@ -2907,6 +2912,11 @@ commondir@^1.0.1: resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= +compare-versions@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.6.0.tgz#1a5689913685e5a87637b8d3ffca75514ec41d62" + integrity sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA== + component-emitter@^1.2.1: version "1.3.0" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" @@ -4382,6 +4392,21 @@ find-up@^4.0.0, find-up@^4.1.0: locate-path "^5.0.0" path-exists "^4.0.0" +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +find-versions@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/find-versions/-/find-versions-4.0.0.tgz#3c57e573bf97769b8cb8df16934b627915da4965" + integrity sha512-wgpWy002tA+wgmO27buH/9KzyEOQnKsG/R0yrcjPT9BOFm0zRBVQbZ95nRGXWMywS8YR5knRbpohio0bcJABxQ== + dependencies: + semver-regex "^3.1.2" + findup-sync@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-3.0.0.tgz#17b108f9ee512dfb7a5c7f3c8b27ea9e1a9c08d1" @@ -4874,6 +4899,22 @@ https-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= +husky@^4.2.1: + version "4.3.8" + resolved "https://registry.yarnpkg.com/husky/-/husky-4.3.8.tgz#31144060be963fd6850e5cc8f019a1dfe194296d" + integrity sha512-LCqqsB0PzJQ/AlCgfrfzRe3e3+NvmefAdKQhRYpxS4u6clblBoDdzzvHi8fmxKRzvMxPY/1WZWzomPZww0Anow== + dependencies: + chalk "^4.0.0" + ci-info "^2.0.0" + compare-versions "^3.6.0" + cosmiconfig "^7.0.0" + find-versions "^4.0.0" + opencollective-postinstall "^2.0.2" + pkg-dir "^5.0.0" + please-upgrade-node "^3.2.0" + slash "^3.0.0" + which-pm-runs "^1.0.0" + iconv-lite@0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -5592,6 +5633,13 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + lodash.clonedeep@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" @@ -6270,6 +6318,11 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0: dependencies: wrappy "1" +opencollective-postinstall@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz#7a0fff978f6dbfa4d006238fbac98ed4198c3259" + integrity sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q== + opn@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/opn/-/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc" @@ -6356,6 +6409,13 @@ p-locate@^4.1.0: dependencies: p-limit "^2.2.0" +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + p-map@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" @@ -6588,6 +6648,13 @@ pkg-dir@^4.1.0: dependencies: find-up "^4.0.0" +pkg-dir@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-5.0.0.tgz#a02d6aebe6ba133a928f74aec20bafdfe6b8e760" + integrity sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA== + dependencies: + find-up "^5.0.0" + pkg-up@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-2.0.0.tgz#c819ac728059a461cab1c3889a2be3c49a004d7f" @@ -6595,6 +6662,13 @@ pkg-up@^2.0.0: dependencies: find-up "^2.1.0" +please-upgrade-node@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz#aeddd3f994c933e4ad98b99d9a556efa0e2fe942" + integrity sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg== + dependencies: + semver-compare "^1.0.0" + pnp-webpack-plugin@^1.6.4: version "1.7.0" resolved "https://registry.yarnpkg.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.7.0.tgz#65741384f6d8056f36e2255a8d67ffc20866f5c9" @@ -8016,6 +8090,16 @@ selfsigned@^1.10.8: dependencies: node-forge "^0.10.0" +semver-compare@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" + integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w= + +semver-regex@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-3.1.2.tgz#34b4c0d361eef262e07199dbef316d0f2ab11807" + integrity sha512-bXWyL6EAKOJa81XG1OZ/Yyuq+oT0b2YLlxx7c+mrdYPaPbnj6WgVULXhinMIeZGufuUBu/eVRqXEhiv4imfwxA== + "semver@2 || 3 || 4 || 5", semver@^5.5.0, semver@^5.6.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" @@ -9260,6 +9344,11 @@ which-module@^2.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= +which-pm-runs@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.0.0.tgz#670b3afbc552e0b55df6b7780ca74615f23ad1cb" + integrity sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs= + which@^1.2.14, which@^1.2.9, which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"