diff --git a/common/envs/dev.ts b/common/envs/dev.ts index 4afb4dac..e643800b 100644 --- a/common/envs/dev.ts +++ b/common/envs/dev.ts @@ -18,5 +18,5 @@ export const DEV_CONFIG: EnvConfig = { sellbet: 'https://sellbet-w3txbmd3ba-uc.a.run.app', createmarket: 'https://createmarket-w3txbmd3ba-uc.a.run.app', }, - heapId: '1877426215', + amplitudeApiKey: 'fd8cbfd964b9a205b8678a39faae71b3', } diff --git a/common/envs/prod.ts b/common/envs/prod.ts index 1c36b29d..bce8cac4 100644 --- a/common/envs/prod.ts +++ b/common/envs/prod.ts @@ -8,7 +8,7 @@ export type EnvConfig = { domain: string firebaseConfig: FirebaseConfig functionEndpoints: Record - heapId?: string + amplitudeApiKey?: string // Access controls adminEmails: string[] @@ -35,7 +35,8 @@ type FirebaseConfig = { export const PROD_CONFIG: EnvConfig = { domain: 'manifold.markets', - heapId: '29268260', + amplitudeApiKey: '2d6509fd4185ebb8be29709842752a15', + firebaseConfig: { apiKey: 'AIzaSyDp3J57vLeAZCzxLD-vcPaGIkAmBoGOSYw', authDomain: 'mantic-markets.firebaseapp.com', diff --git a/web/components/answers/answer-bet-panel.tsx b/web/components/answers/answer-bet-panel.tsx index ccb4fd14..c483345c 100644 --- a/web/components/answers/answer-bet-panel.tsx +++ b/web/components/answers/answer-bet-panel.tsx @@ -24,6 +24,7 @@ import { } from 'common/calculate-dpm' import { firebaseLogin } from 'web/lib/firebase/users' import { Bet } from 'common/bet' +import { track } from 'web/lib/service/analytics' export function AnswerBetPanel(props: { answer: Answer @@ -72,6 +73,15 @@ export function AnswerBetPanel(props: { } setIsSubmitting(false) }) + + track('bet', { + location: 'answer panel', + outcomeType: contract.outcomeType, + slug: contract.slug, + contractId: contract.id, + amount: betAmount, + outcome: answerId, + }) } const betDisabled = isSubmitting || !betAmount || error diff --git a/web/components/bet-panel.tsx b/web/components/bet-panel.tsx index 14acaaa0..aaca3ffb 100644 --- a/web/components/bet-panel.tsx +++ b/web/components/bet-panel.tsx @@ -38,6 +38,7 @@ import { SellRow } from './sell-row' import { useSaveShares } from './use-save-shares' import { SignUpPrompt } from './sign-up-prompt' import { isIOS } from 'web/lib/util/device' +import { track } from 'web/lib/service/analytics' export function BetPanel(props: { contract: BinaryContract @@ -251,6 +252,15 @@ function BuyPanel(props: { } setIsSubmitting(false) }) + + track('bet', { + location: 'bet panel', + outcomeType: contract.outcomeType, + slug: contract.slug, + contractId: contract.id, + amount: betAmount, + outcome: betChoice, + }) } const betDisabled = isSubmitting || !betAmount || error @@ -423,6 +433,14 @@ export function SellPanel(props: { } setIsSubmitting(false) }) + + track('sell shares', { + outcomeType: contract.outcomeType, + slug: contract.slug, + contractId: contract.id, + shares: sellAmount, + outcome: sharesOutcome, + }) } const initialProb = getProbability(contract) diff --git a/web/components/contract/quick-bet.tsx b/web/components/contract/quick-bet.tsx index 1a532eac..5dbb0fb5 100644 --- a/web/components/contract/quick-bet.tsx +++ b/web/components/contract/quick-bet.tsx @@ -24,6 +24,7 @@ import { OUTCOME_TO_COLOR } from '../outcome-label' import { useSaveShares } from '../use-save-shares' import { sellShares } from 'web/lib/firebase/api-call' import { calculateCpmmSale, getCpmmProbability } from 'common/calculate-cpmm' +import { track } from 'web/lib/service/analytics' const BET_SIZE = 10 @@ -121,6 +122,12 @@ export function QuickBet(props: { contract: Contract; user: User }) { success: message, error: (err) => `${err.message}`, }) + + track('quick bet', { + slug: contract.slug, + direction, + contractId: contract.id, + }) } function quickOutcome(contract: Contract, direction: 'UP' | 'DOWN') { diff --git a/web/components/landing-page-panel.tsx b/web/components/landing-page-panel.tsx index f3ddf4f1..ad1a369c 100644 --- a/web/components/landing-page-panel.tsx +++ b/web/components/landing-page-panel.tsx @@ -7,6 +7,7 @@ import { firebaseLogin } from 'web/lib/firebase/users' import { ContractsGrid } from './contract/contracts-list' import { Col } from './layout/col' import { Row } from './layout/row' +import { withTracking } from 'web/lib/service/analytics' export function LandingPagePanel(props: { hotContracts: Contract[] }) { const { hotContracts } = props @@ -45,7 +46,7 @@ export function LandingPagePanel(props: { hotContracts: Contract[] }) { {' '} diff --git a/web/components/numeric-bet-panel.tsx b/web/components/numeric-bet-panel.tsx index df52c0f7..9246bc89 100644 --- a/web/components/numeric-bet-panel.tsx +++ b/web/components/numeric-bet-panel.tsx @@ -19,6 +19,7 @@ import { Col } from './layout/col' import { Row } from './layout/row' import { Spacer } from './layout/spacer' import { SignUpPrompt } from './sign-up-prompt' +import { track } from 'web/lib/service/analytics' export function NumericBetPanel(props: { contract: NumericContract @@ -96,6 +97,15 @@ function NumericBuyPanel(props: { } setIsSubmitting(false) }) + + track('bet', { + location: 'numeric panel', + outcomeType: contract.outcomeType, + slug: contract.slug, + contractId: contract.id, + amount: betAmount, + value, + }) } const betDisabled = isSubmitting || !betAmount || !bucketChoice || error diff --git a/web/hooks/use-user.ts b/web/hooks/use-user.ts index 4605da3c..c4d1dff9 100644 --- a/web/hooks/use-user.ts +++ b/web/hooks/use-user.ts @@ -13,7 +13,7 @@ import { userDocRef, } from 'web/lib/firebase/users' import { useStateCheckEquality } from './use-state-check-equality' -import { identifyUser } from 'web/lib/service/analytics' +import { identifyUser, setUserProperty } from 'web/lib/service/analytics' export const useUser = () => { const [user, setUser] = useStateCheckEquality( @@ -22,14 +22,14 @@ export const useUser = () => { useEffect(() => listenForLogin(setUser), [setUser]) - const userId = user?.id - useEffect(() => { - if (userId) { - identifyUser(userId) - return listenForUser(userId, setUser) + if (user) { + identifyUser(user.id) + setUserProperty('username', user.username) + + return listenForUser(user.id, setUser) } - }, [userId, setUser]) + }, [user, setUser]) return user } diff --git a/web/lib/firebase/comments.ts b/web/lib/firebase/comments.ts index e96c080b..6be845cb 100644 --- a/web/lib/firebase/comments.ts +++ b/web/lib/firebase/comments.ts @@ -14,6 +14,7 @@ import { db } from './init' import { User } from 'common/user' import { Comment } from 'common/comment' import { removeUndefinedProps } from 'common/util/object' +import { track } from '@amplitude/analytics-browser' export type { Comment } @@ -43,6 +44,12 @@ export async function createComment( answerOutcome: answerOutcome, replyToCommentId: replyToCommentId, }) + track('comment', { + contractId, + commentId: ref.id, + betId: betId, + replyToCommentId: replyToCommentId, + }) return await setDoc(ref, comment) } diff --git a/web/lib/service/analytics.ts b/web/lib/service/analytics.ts index b55dcb7e..2a9b4078 100644 --- a/web/lib/service/analytics.ts +++ b/web/lib/service/analytics.ts @@ -1,4 +1,33 @@ -export function identifyUser(userId: string) { - const w = window as any // needed to stop weird prettier/eslint conflict - w?.heap?.identify(userId) +import { + init, + track, + identify, + setUserId, + Identify, +} from '@amplitude/analytics-browser' + +import { ENV_CONFIG } from 'common/envs/constants' + +init(ENV_CONFIG.amplitudeApiKey ?? '', undefined, { includeReferrer: true }) + +export { track } + +// convenience function +export const withTracking = + ( + f: (() => void) | (() => Promise), + eventName: string, + eventProperties?: any + ) => + () => + Promise.all([f(), track(eventName, eventProperties).promise]) + +export async function identifyUser(userId: string) { + setUserId(userId) +} + +export async function setUserProperty(property: string, value: string) { + const identifyObj = new Identify() + identifyObj.set(property, value) + await identify(identifyObj) } diff --git a/web/package.json b/web/package.json index 35b71341..4fc83ad0 100644 --- a/web/package.json +++ b/web/package.json @@ -17,6 +17,7 @@ "verify": "(cd .. && yarn verify)" }, "dependencies": { + "@amplitude/analytics-browser": "0.4.1", "@headlessui/react": "1.6.1", "@heroicons/react": "1.0.5", "@nivo/core": "0.74.0", @@ -37,7 +38,7 @@ "react-confetti": "6.0.1", "react-dom": "17.0.2", "react-expanding-textarea": "2.3.5", - "react-hot-toast": "^2.2.0", + "react-hot-toast": "2.2.0", "react-instantsearch-hooks-web": "6.24.1", "react-query": "3.39.0" }, diff --git a/web/pages/_app.tsx b/web/pages/_app.tsx index 730f93c9..d081bc9a 100644 --- a/web/pages/_app.tsx +++ b/web/pages/_app.tsx @@ -5,7 +5,6 @@ import Head from 'next/head' import Script from 'next/script' import { usePreserveScroll } from 'web/hooks/use-preserve-scroll' import { QueryClient, QueryClientProvider } from 'react-query' -import { ENV_CONFIG } from 'common/envs/constants' function firstLine(msg: string) { return msg.replace(/\r?\n.*/s, '') @@ -40,12 +39,6 @@ function MyApp({ Component, pageProps }: AppProps) { gtag('config', 'G-SSFK1Q138D'); `} - {ENV_CONFIG.heapId && ( - - )} Manifold Markets — A market for every question diff --git a/web/pages/create.tsx b/web/pages/create.tsx index 68393081..7b9b2da0 100644 --- a/web/pages/create.tsx +++ b/web/pages/create.tsx @@ -21,6 +21,7 @@ import { useHasCreatedContractToday } from 'web/hooks/use-has-created-contract-t import { removeUndefinedProps } from 'common/util/object' import { CATEGORIES } from 'common/categories' import { ChoicesToggleGroup } from 'web/components/choices-toggle-group' +import { track } from 'web/lib/service/analytics' export default function Create() { const [question, setQuestion] = useState('') @@ -77,6 +78,9 @@ export function NewContract(props: { question: string }) { const [ante, _setAnte] = useState(FIXED_ANTE) const mustWaitForDailyFreeMarketStatus = useHasCreatedContractToday(creator) + const isFree = + mustWaitForDailyFreeMarketStatus != 'loading' && + !mustWaitForDailyFreeMarketStatus // useEffect(() => { // if (ante === null && creator) { @@ -149,6 +153,14 @@ export function NewContract(props: { question: string }) { max, }) ) + + track('create market', { + slug: result.slug, + initialProb, + category, + isFree, + }) + await router.push(contractPath(result as Contract)) } catch (e) { console.log('error creating contract', e) diff --git a/yarn.lock b/yarn.lock index 17e11464..825ff895 100644 --- a/yarn.lock +++ b/yarn.lock @@ -227,6 +227,88 @@ "@algolia/logger-common" "4.13.1" "@algolia/requester-common" "4.13.1" +"@amplitude/analytics-browser@0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@amplitude/analytics-browser/-/analytics-browser-0.4.1.tgz#d686ab89fb12cdb3ba6aaade87b8d4bb8f72e86f" + integrity sha512-omiUvv2v+sznKjFj5s4vBoVkfqsEAFqW1FQUpZuWpaekOb4/n5zhTAzs2NQMq1hFxmIh9DxqM4wY0y347CFBHg== + dependencies: + "@amplitude/analytics-core" "^0.3.1" + "@amplitude/analytics-types" "^0.2.1" + "@amplitude/ua-parser-js" "^0.7.26" + tslib "^2.3.1" + +"@amplitude/analytics-core@^0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@amplitude/analytics-core/-/analytics-core-0.3.1.tgz#e86eb8e5cbab06063f04b7cf9f41a238d9a124b8" + integrity sha512-BgfSE49GXyYQtqL0E6xQhw9VcaYaAOgqAedyHB1VsvgVQUXEv8z1GM6GhGZVqCA5afwtq6fu80p2iqGTGuSP+g== + dependencies: + "@amplitude/analytics-types" "^0.2.1" + tslib "^2.3.1" + +"@amplitude/analytics-types@^0.2.1": + version "0.2.1" + resolved "https://registry.yarnpkg.com/@amplitude/analytics-types/-/analytics-types-0.2.1.tgz#ab4f9b4bbec8afa768a27af78f75bb69dd2a3fc7" + integrity sha512-+FfXlCjHysYWliRBjD2wQ2gZ4V6jGKskdt9j8npv9Rmzdehj04OAHudZ/UrgH5++88As9ww1wyaS7y4sm4x8vA== + +"@amplitude/eslint-config-typescript@^1.10.0": + version "1.10.0" + resolved "https://registry.yarnpkg.com/@amplitude/eslint-config-typescript/-/eslint-config-typescript-1.10.0.tgz#eaaa605f46bf0564096fdd6c2fcf22f98e60a7bc" + integrity sha512-LENR1RDL8MzEj0Sp37CEHHtnIpiBnYWQWhd8W9/4XpLAz5IN4Am08wFYp1SrmqHErfLjQMtifHnjMQtvRhuXiw== + dependencies: + eslint-config-prettier "^8.1.0" + +"@amplitude/identify@^1.10.0": + version "1.10.0" + resolved "https://registry.yarnpkg.com/@amplitude/identify/-/identify-1.10.0.tgz#d62b8b6785c29350c368810475a6fc7b04985210" + integrity sha512-BshMDcZX9qO4mgGBR45HmiHxfcPCDY/eBOE/MTUZBW+y9+N61aKmNY3YJsAUfRPzieDiyfqs8rNm7quVkaNzJQ== + dependencies: + "@amplitude/types" "^1.10.0" + "@amplitude/utils" "^1.10.0" + tslib "^1.9.3" + +"@amplitude/node@1.10.0": + version "1.10.0" + resolved "https://registry.yarnpkg.com/@amplitude/node/-/node-1.10.0.tgz#33f84ddf82b31471fce53e6fa60b688d4bc62ee4" + integrity sha512-Jh8w1UpxhonWe0kCALVvqiBE3vo5NYmbNZbZrrI9Lfa/1HbGboZlGdg0I7/WtihbZvEjpfcfTOf8OkmtZh6vsQ== + dependencies: + "@amplitude/identify" "^1.10.0" + "@amplitude/types" "^1.10.0" + "@amplitude/utils" "^1.10.0" + tslib "^1.9.3" + +"@amplitude/types@^1.10.0": + version "1.10.0" + resolved "https://registry.yarnpkg.com/@amplitude/types/-/types-1.10.0.tgz#dfaf7cc25f533a1e2b0ef0ad675371b396733c0f" + integrity sha512-xN0gnhutztv6kqHaZ2bre18anQV5GDmMXOeipTvI670g2VjNbPfOzMwu1LN4p1NadYq+GqYI223UcZrXR+R4Pw== + +"@amplitude/typescript@^1.10.0": + version "1.10.0" + resolved "https://registry.yarnpkg.com/@amplitude/typescript/-/typescript-1.10.0.tgz#a8a8ab9c8320ddbe11aed52e48c70ed4d025a045" + integrity sha512-GG5sGOiiPVl00YFlY/nnIBK6gEZ4G8s3EqBZhF236wem091YmOsjzJagNfU4KhqnxaHTrL5LODzT04ZlY3UYFg== + dependencies: + "@amplitude/eslint-config-typescript" "^1.10.0" + "@typescript-eslint/eslint-plugin" "^2.30.0" + "@typescript-eslint/parser" "^2.30.0" + eslint-config-standard "^14.1.1" + eslint-config-standard-with-typescript "^16.0.0" + eslint-plugin-import "^2.20.2" + eslint-plugin-node "^11.1.0" + eslint-plugin-promise "^4.2.1" + eslint-plugin-standard "^4.0.1" + +"@amplitude/ua-parser-js@^0.7.26": + version "0.7.31" + resolved "https://registry.yarnpkg.com/@amplitude/ua-parser-js/-/ua-parser-js-0.7.31.tgz#749bf7cb633cfcc7ff3c10805bad7c5f6fbdbc61" + integrity sha512-+z8UGRaj13Pt5NDzOnkTBy49HE2CX64jeL0ArB86HAtilpnfkPB7oqkigN7Lf2LxscMg4QhFD7mmCfedh3rqTg== + +"@amplitude/utils@^1.10.0": + version "1.10.0" + resolved "https://registry.yarnpkg.com/@amplitude/utils/-/utils-1.10.0.tgz#138b0ba4e5755540a9e4abf426b7a25d045418a9" + integrity sha512-/R8j8IzFH0GYfA6ehQDm5IEzt71gIeMdiYYFIzZp6grERQlgJcwNJMAiza0o2JwwTDIruzqdB3c/vLVjuakp+w== + dependencies: + "@amplitude/types" "^1.10.0" + tslib "^1.9.3" + "@ampproject/remapping@^2.1.0": version "2.2.0" resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" @@ -2844,6 +2926,11 @@ "@types/eslint" "*" "@types/estree" "*" +"@types/eslint-visitor-keys@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" + integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag== + "@types/eslint@*": version "8.4.2" resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.4.2.tgz#48f2ac58ab9c631cb68845c3d956b28f79fad575" @@ -2919,7 +3006,7 @@ dependencies: "@types/node" "*" -"@types/json-schema@*", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": +"@types/json-schema@*", "@types/json-schema@^7.0.3", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": version "7.0.11" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== @@ -3115,6 +3202,26 @@ semver "^7.3.7" tsutils "^3.21.0" +"@typescript-eslint/eslint-plugin@^2.30.0": + version "2.34.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.34.0.tgz#6f8ce8a46c7dea4a6f1d171d2bb8fbae6dac2be9" + integrity sha512-4zY3Z88rEE99+CNvTbXSyovv2z9PNOVffTWD2W8QF5s2prBQtwN2zadqERcrHpcR7O/+KMI3fcTAmUUhK/iQcQ== + dependencies: + "@typescript-eslint/experimental-utils" "2.34.0" + functional-red-black-tree "^1.0.1" + regexpp "^3.0.0" + tsutils "^3.17.1" + +"@typescript-eslint/experimental-utils@2.34.0": + version "2.34.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz#d3524b644cdb40eebceca67f8cf3e4cc9c8f980f" + integrity sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA== + dependencies: + "@types/json-schema" "^7.0.3" + "@typescript-eslint/typescript-estree" "2.34.0" + eslint-scope "^5.0.0" + eslint-utils "^2.0.0" + "@typescript-eslint/parser@5.25.0", "@typescript-eslint/parser@^5.21.0": version "5.25.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.25.0.tgz#fb533487147b4b9efd999a4d2da0b6c263b64f7f" @@ -3125,6 +3232,16 @@ "@typescript-eslint/typescript-estree" "5.25.0" debug "^4.3.4" +"@typescript-eslint/parser@^2.26.0", "@typescript-eslint/parser@^2.30.0": + version "2.34.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.34.0.tgz#50252630ca319685420e9a39ca05fe185a256bc8" + integrity sha512-03ilO0ucSD0EPTw2X4PntSIRFtDPWjrVq7C3/Z3VQHRC7+13YB55rcJI3Jt+YgeHbjUdJPcPa7b23rXCBokuyA== + dependencies: + "@types/eslint-visitor-keys" "^1.0.0" + "@typescript-eslint/experimental-utils" "2.34.0" + "@typescript-eslint/typescript-estree" "2.34.0" + eslint-visitor-keys "^1.1.0" + "@typescript-eslint/scope-manager@5.25.0": version "5.25.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.25.0.tgz#e78f1484bca7e484c48782075219c82c6b77a09f" @@ -3147,6 +3264,19 @@ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.25.0.tgz#dee51b1855788b24a2eceeae54e4adb89b088dd8" integrity sha512-7fWqfxr0KNHj75PFqlGX24gWjdV/FDBABXL5dyvBOWHpACGyveok8Uj4ipPX/1fGU63fBkzSIycEje4XsOxUFA== +"@typescript-eslint/typescript-estree@2.34.0": + version "2.34.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz#14aeb6353b39ef0732cc7f1b8285294937cf37d5" + integrity sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg== + dependencies: + debug "^4.1.1" + eslint-visitor-keys "^1.1.0" + glob "^7.1.6" + is-glob "^4.0.1" + lodash "^4.17.15" + semver "^7.3.2" + tsutils "^3.17.1" + "@typescript-eslint/typescript-estree@5.25.0": version "5.25.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.25.0.tgz#a7ab40d32eb944e3fb5b4e3646e81b1bcdd63e00" @@ -5340,6 +5470,24 @@ eslint-config-next@12.1.6: eslint-plugin-react "^7.29.4" eslint-plugin-react-hooks "^4.5.0" +eslint-config-prettier@^8.1.0: + version "8.5.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz#5a81680ec934beca02c7b1a61cf8ca34b66feab1" + integrity sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q== + +eslint-config-standard-with-typescript@^16.0.0: + version "16.0.0" + resolved "https://registry.yarnpkg.com/eslint-config-standard-with-typescript/-/eslint-config-standard-with-typescript-16.0.0.tgz#71418b9a3eb82ebff31cac67222562c683959ae4" + integrity sha512-SpEQcg8x4DchhOq4fCDA4cb83GzSVxEKzPyjxAc7p136sKAflPr3E/zvn9x9ooOXqtBlbISDpB0wC2L3K8nWZQ== + dependencies: + "@typescript-eslint/parser" "^2.26.0" + eslint-config-standard "^14.1.1" + +eslint-config-standard@^14.1.1: + version "14.1.1" + resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-14.1.1.tgz#830a8e44e7aef7de67464979ad06b406026c56ea" + integrity sha512-Z9B+VR+JIXRxz21udPTL9HpFMyoMUEeX1G251EQ6e05WD9aPVtVBn09XUmZ259wCMlCDmYDSZG62Hhm+ZTJcUg== + eslint-import-resolver-node@^0.3.6: version "0.3.6" resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz#4048b958395da89668252001dbd9eca6b83bacbd" @@ -5367,7 +5515,15 @@ eslint-module-utils@^2.7.3: debug "^3.2.7" find-up "^2.1.0" -eslint-plugin-import@^2.26.0: +eslint-plugin-es@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz#75a7cdfdccddc0589934aeeb384175f221c57893" + integrity sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ== + dependencies: + eslint-utils "^2.0.0" + regexpp "^3.0.0" + +eslint-plugin-import@^2.20.2, eslint-plugin-import@^2.26.0: version "2.26.0" resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz#f812dc47be4f2b72b478a021605a59fc6fe8b88b" integrity sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA== @@ -5411,6 +5567,23 @@ eslint-plugin-lodash@^7.4.0: dependencies: lodash "^4.17.21" +eslint-plugin-node@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz#c95544416ee4ada26740a30474eefc5402dc671d" + integrity sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g== + dependencies: + eslint-plugin-es "^3.0.0" + eslint-utils "^2.0.0" + ignore "^5.1.1" + minimatch "^3.0.4" + resolve "^1.10.1" + semver "^6.1.0" + +eslint-plugin-promise@^4.2.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-4.3.1.tgz#61485df2a359e03149fdafc0a68b0e030ad2ac45" + integrity sha512-bY2sGqyptzFBDLh/GMbAxfdJC+b0f23ME63FOE4+Jao0oZ3E1LEwFtWJX/1pGMJLiTtrSSern2CRM/g+dfc0eQ== + eslint-plugin-react-hooks@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.5.0.tgz#5f762dfedf8b2cf431c689f533c9d3fa5dcf25ad" @@ -5436,7 +5609,12 @@ eslint-plugin-react@^7.29.4: semver "^6.3.0" string.prototype.matchall "^4.0.7" -eslint-scope@5.1.1, eslint-scope@^5.1.1: +eslint-plugin-standard@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-4.1.0.tgz#0c3bf3a67e853f8bbbc580fb4945fbf16f41b7c5" + integrity sha512-ZL7+QRixjTR6/528YNGyDotyffm5OQst/sGxKDwGb9Uqs4In5Egi4+jbobhqJoyoCM6/7v/1A5fhQ7ScMtDjaQ== + +eslint-scope@5.1.1, eslint-scope@^5.0.0, eslint-scope@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== @@ -5452,6 +5630,13 @@ eslint-scope@^7.1.1: esrecurse "^4.3.0" estraverse "^5.2.0" +eslint-utils@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" + integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== + dependencies: + eslint-visitor-keys "^1.1.0" + eslint-utils@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" @@ -5459,6 +5644,11 @@ eslint-utils@^3.0.0: dependencies: eslint-visitor-keys "^2.0.0" +eslint-visitor-keys@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" + integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== + eslint-visitor-keys@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" @@ -6734,7 +6924,7 @@ idb@3.0.2: resolved "https://registry.yarnpkg.com/idb/-/idb-3.0.2.tgz#c8e9122d5ddd40f13b60ae665e4862f8b13fa384" integrity sha512-+FLa/0sTXqyux0o6C+i2lOR0VoS60LU/jzUo5xjfY6+7sEEgy4Gz1O7yFBXvjd7N0NyIGWIRg8DcQSLEG+VSPw== -ignore@^5.1.9, ignore@^5.2.0: +ignore@^5.1.1, ignore@^5.1.9, ignore@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== @@ -7641,7 +7831,7 @@ lodash.uniq@4.5.0, lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== -lodash@4.17.21, lodash@^4.17.14, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.5: +lodash@4.17.21, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.5: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -9294,7 +9484,7 @@ react-helmet-async@*, react-helmet-async@^1.2.3: react-fast-compare "^3.2.0" shallowequal "^1.1.0" -react-hot-toast@^2.2.0: +react-hot-toast@2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/react-hot-toast/-/react-hot-toast-2.2.0.tgz#ab6f4caed4214b9534f94bb8cfaaf21b051e62b9" integrity sha512-248rXw13uhf/6TNDVzagX+y7R8J183rp7MwUMNkcrBRyHj/jWOggfXTGlM8zAOuh701WyVW+eUaWG2LeSufX9g== @@ -9516,7 +9706,7 @@ regexp.prototype.flags@^1.4.1, regexp.prototype.flags@^1.4.3: define-properties "^1.1.3" functions-have-names "^1.2.2" -regexpp@^3.2.0: +regexpp@^3.0.0, regexpp@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== @@ -9720,7 +9910,7 @@ resolve-pathname@^3.0.0: resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-3.0.0.tgz#99d02224d3cf263689becbb393bc560313025dcd" integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng== -resolve@^1.1.6, resolve@^1.14.2, resolve@^1.20.0, resolve@^1.22.0, resolve@^1.3.2: +resolve@^1.1.6, resolve@^1.10.1, resolve@^1.14.2, resolve@^1.20.0, resolve@^1.22.0, resolve@^1.3.2: version "1.22.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== @@ -9931,7 +10121,7 @@ semver@^5.4.1, semver@^5.6.0: resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: +semver@^6.0.0, semver@^6.1.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== @@ -10617,7 +10807,7 @@ tsconfig-paths@^3.14.1: minimist "^1.2.6" strip-bom "^3.0.0" -tslib@^1.8.1, tslib@^1.9.0: +tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== @@ -10632,7 +10822,7 @@ tsscmp@^1.0.6: resolved "https://registry.yarnpkg.com/tsscmp/-/tsscmp-1.0.6.tgz#85b99583ac3589ec4bfef825b5000aa911d605eb" integrity sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA== -tsutils@^3.21.0: +tsutils@^3.17.1, tsutils@^3.21.0: version "3.21.0" resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==