- {user.email} |
+ {user.email || user.phone_number} |
{dayjs(user.created_at * 1000).format('MMM DD, YYYY')}
|
@@ -327,9 +343,15 @@ export default function Users() {
- {user.email_verified.toString()}
+ {(
+ user.email_verified || user.phone_number_verified
+ ).toString()}
@@ -368,13 +390,14 @@ export default function Users() {
- {!user.email_verified && (
-
- )}
+ {!user.email_verified &&
+ !user.phone_number_verified && (
+
+ )}
=1.0.0", "@chakra-ui/system@1.8.3":
- "integrity" "sha512-6MaevsT7A2ifgOGQQCQsfvzPVd0kEXqFrX1Oxd842bawaqthmbFdo2bBTdaia/+Ivq/8Xot2uAQSbU+3NuRiUA=="
- "resolved" "https://registry.npmjs.org/@chakra-ui/system/-/system-1.8.3.tgz"
- "version" "1.8.3"
+ version "1.8.3"
+ resolved "https://registry.npmjs.org/@chakra-ui/system/-/system-1.8.3.tgz"
+ integrity sha512-6MaevsT7A2ifgOGQQCQsfvzPVd0kEXqFrX1Oxd842bawaqthmbFdo2bBTdaia/+Ivq/8Xot2uAQSbU+3NuRiUA==
dependencies:
"@chakra-ui/color-mode" "1.3.2"
"@chakra-ui/react-utils" "1.2.1"
"@chakra-ui/styled-system" "1.15.0"
"@chakra-ui/utils" "1.9.1"
- "react-fast-compare" "3.2.0"
+ react-fast-compare "3.2.0"
"@chakra-ui/table@1.3.1":
- "integrity" "sha512-+ia/7zs7AGj01lon301EEx+mK4918yGc0K6e68Kxomex8tnxkwbskFWs6hX+6Kzbj56ZBm99eLlKpo2iGYX0HA=="
- "resolved" "https://registry.npmjs.org/@chakra-ui/table/-/table-1.3.1.tgz"
- "version" "1.3.1"
+ version "1.3.1"
+ resolved "https://registry.npmjs.org/@chakra-ui/table/-/table-1.3.1.tgz"
+ integrity sha512-+ia/7zs7AGj01lon301EEx+mK4918yGc0K6e68Kxomex8tnxkwbskFWs6hX+6Kzbj56ZBm99eLlKpo2iGYX0HA==
dependencies:
"@chakra-ui/utils" "1.9.1"
"@chakra-ui/tabs@1.6.1":
- "integrity" "sha512-p7HdHcleJWNwteWYVPt2KF52YbS5pIIfs/IpgtnYZRsJbqvRVxSwgg5Wsn+vuxFXBKW0cA2rDGbyzsZ+ChtEXQ=="
- "resolved" "https://registry.npmjs.org/@chakra-ui/tabs/-/tabs-1.6.1.tgz"
- "version" "1.6.1"
+ version "1.6.1"
+ resolved "https://registry.npmjs.org/@chakra-ui/tabs/-/tabs-1.6.1.tgz"
+ integrity sha512-p7HdHcleJWNwteWYVPt2KF52YbS5pIIfs/IpgtnYZRsJbqvRVxSwgg5Wsn+vuxFXBKW0cA2rDGbyzsZ+ChtEXQ==
dependencies:
"@chakra-ui/clickable" "1.2.1"
"@chakra-ui/descendant" "2.1.1"
@@ -676,42 +676,42 @@
"@chakra-ui/utils" "1.9.1"
"@chakra-ui/tag@1.2.2":
- "integrity" "sha512-H25y9nEyUAUdwQDND9P4mMXKf1wf9UH4A3DyP237qVKIyYBpa4aCH8eJU4dunh2yIzASB0DWcr7lsul/HAHxmg=="
- "resolved" "https://registry.npmjs.org/@chakra-ui/tag/-/tag-1.2.2.tgz"
- "version" "1.2.2"
+ version "1.2.2"
+ resolved "https://registry.npmjs.org/@chakra-ui/tag/-/tag-1.2.2.tgz"
+ integrity sha512-H25y9nEyUAUdwQDND9P4mMXKf1wf9UH4A3DyP237qVKIyYBpa4aCH8eJU4dunh2yIzASB0DWcr7lsul/HAHxmg==
dependencies:
"@chakra-ui/icon" "2.0.0"
"@chakra-ui/utils" "1.9.1"
"@chakra-ui/textarea@1.2.2":
- "integrity" "sha512-DoLdKxHk0DyrQDnj1la9wjl2AW3/SK62nfWDYLAm0ouFsw1VKPw9nU+Yyj0dPruQTzI19nLaYF26i97rtnT27g=="
- "resolved" "https://registry.npmjs.org/@chakra-ui/textarea/-/textarea-1.2.2.tgz"
- "version" "1.2.2"
+ version "1.2.2"
+ resolved "https://registry.npmjs.org/@chakra-ui/textarea/-/textarea-1.2.2.tgz"
+ integrity sha512-DoLdKxHk0DyrQDnj1la9wjl2AW3/SK62nfWDYLAm0ouFsw1VKPw9nU+Yyj0dPruQTzI19nLaYF26i97rtnT27g==
dependencies:
"@chakra-ui/form-control" "1.5.2"
"@chakra-ui/utils" "1.9.1"
"@chakra-ui/theme-tools@^1.3.1", "@chakra-ui/theme-tools@1.3.1":
- "integrity" "sha512-D8arJ5uFGuYZrrFGpXqgov8FhsJYWRyar5oBZY5TJR9gsVYBlJ8Ai91pwM/NflCFqzerTOgyt7bNSGQMdZ8ghA=="
- "resolved" "https://registry.npmjs.org/@chakra-ui/theme-tools/-/theme-tools-1.3.1.tgz"
- "version" "1.3.1"
+ version "1.3.1"
+ resolved "https://registry.npmjs.org/@chakra-ui/theme-tools/-/theme-tools-1.3.1.tgz"
+ integrity sha512-D8arJ5uFGuYZrrFGpXqgov8FhsJYWRyar5oBZY5TJR9gsVYBlJ8Ai91pwM/NflCFqzerTOgyt7bNSGQMdZ8ghA==
dependencies:
"@chakra-ui/utils" "1.9.1"
"@ctrl/tinycolor" "^3.4.0"
"@chakra-ui/theme@>=1.0.0", "@chakra-ui/theme@1.12.2":
- "integrity" "sha512-LVjSf16yYHD40ILrsDEd3idVQRvJSY7JY8lvTGWo2p6v+JQESWF+zXlYi9Le+TXRpZuFvJuuQ1SEvoqVwdcJ8Q=="
- "resolved" "https://registry.npmjs.org/@chakra-ui/theme/-/theme-1.12.2.tgz"
- "version" "1.12.2"
+ version "1.12.2"
+ resolved "https://registry.npmjs.org/@chakra-ui/theme/-/theme-1.12.2.tgz"
+ integrity sha512-LVjSf16yYHD40ILrsDEd3idVQRvJSY7JY8lvTGWo2p6v+JQESWF+zXlYi9Le+TXRpZuFvJuuQ1SEvoqVwdcJ8Q==
dependencies:
"@chakra-ui/anatomy" "1.2.1"
"@chakra-ui/theme-tools" "1.3.1"
"@chakra-ui/utils" "1.9.1"
"@chakra-ui/toast@1.5.0":
- "integrity" "sha512-rTsFx/Qos5oVPN6aZMbT/wTxwZlFNSXQqrTpJYaRcRFQGzxIDDxmGkKYfPnyJjRP9i6EqynJhXEIyhMA0xO0dw=="
- "resolved" "https://registry.npmjs.org/@chakra-ui/toast/-/toast-1.5.0.tgz"
- "version" "1.5.0"
+ version "1.5.0"
+ resolved "https://registry.npmjs.org/@chakra-ui/toast/-/toast-1.5.0.tgz"
+ integrity sha512-rTsFx/Qos5oVPN6aZMbT/wTxwZlFNSXQqrTpJYaRcRFQGzxIDDxmGkKYfPnyJjRP9i6EqynJhXEIyhMA0xO0dw==
dependencies:
"@chakra-ui/alert" "1.3.2"
"@chakra-ui/close-button" "1.2.2"
@@ -722,9 +722,9 @@
"@reach/alert" "0.13.2"
"@chakra-ui/tooltip@1.4.2":
- "integrity" "sha512-+wyYXG8qenKkFy2YSFfOBf3rlWADnu6S9EUxP+3Rmm78unOWXDuTJWzqy2QlXs2BwoQoifaz1LVwzmMb7WLVgQ=="
- "resolved" "https://registry.npmjs.org/@chakra-ui/tooltip/-/tooltip-1.4.2.tgz"
- "version" "1.4.2"
+ version "1.4.2"
+ resolved "https://registry.npmjs.org/@chakra-ui/tooltip/-/tooltip-1.4.2.tgz"
+ integrity sha512-+wyYXG8qenKkFy2YSFfOBf3rlWADnu6S9EUxP+3Rmm78unOWXDuTJWzqy2QlXs2BwoQoifaz1LVwzmMb7WLVgQ==
dependencies:
"@chakra-ui/hooks" "1.7.1"
"@chakra-ui/popper" "2.4.1"
@@ -734,38 +734,38 @@
"@chakra-ui/visually-hidden" "1.1.1"
"@chakra-ui/transition@1.4.2":
- "integrity" "sha512-S+BNmpErHlntl//uaqv0sJegzMsQms0OnJapeZaRsvZL4s1SVYrR8kMrXigkdpeh4lAUqGsLpQHPKkzaKGbBOw=="
- "resolved" "https://registry.npmjs.org/@chakra-ui/transition/-/transition-1.4.2.tgz"
- "version" "1.4.2"
+ version "1.4.2"
+ resolved "https://registry.npmjs.org/@chakra-ui/transition/-/transition-1.4.2.tgz"
+ integrity sha512-S+BNmpErHlntl//uaqv0sJegzMsQms0OnJapeZaRsvZL4s1SVYrR8kMrXigkdpeh4lAUqGsLpQHPKkzaKGbBOw==
dependencies:
"@chakra-ui/utils" "1.9.1"
"@chakra-ui/utils@^1.9.1", "@chakra-ui/utils@1.9.1":
- "integrity" "sha512-Tue8JfpzOqeHd8vSqAnX1l/Y3Gg456+BXFP/TH6mCIeqMAMbrvv25vDskds0wlXRjMYdmpqHxCEzkalFrscGHA=="
- "resolved" "https://registry.npmjs.org/@chakra-ui/utils/-/utils-1.9.1.tgz"
- "version" "1.9.1"
+ version "1.9.1"
+ resolved "https://registry.npmjs.org/@chakra-ui/utils/-/utils-1.9.1.tgz"
+ integrity sha512-Tue8JfpzOqeHd8vSqAnX1l/Y3Gg456+BXFP/TH6mCIeqMAMbrvv25vDskds0wlXRjMYdmpqHxCEzkalFrscGHA==
dependencies:
"@types/lodash.mergewith" "4.6.6"
- "css-box-model" "1.2.1"
- "framesync" "5.3.0"
- "lodash.mergewith" "4.6.2"
+ css-box-model "1.2.1"
+ framesync "5.3.0"
+ lodash.mergewith "4.6.2"
"@chakra-ui/visually-hidden@1.1.1":
- "integrity" "sha512-AGK9YBQS2FW/1e5tfivS8VVXn8y2uTyJ9ACOnGiLm9FNdth9pR0fGil9axlcmhZpEYcSRlnCuma3nkqaCjJnAA=="
- "resolved" "https://registry.npmjs.org/@chakra-ui/visually-hidden/-/visually-hidden-1.1.1.tgz"
- "version" "1.1.1"
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/@chakra-ui/visually-hidden/-/visually-hidden-1.1.1.tgz"
+ integrity sha512-AGK9YBQS2FW/1e5tfivS8VVXn8y2uTyJ9ACOnGiLm9FNdth9pR0fGil9axlcmhZpEYcSRlnCuma3nkqaCjJnAA==
dependencies:
"@chakra-ui/utils" "1.9.1"
"@ctrl/tinycolor@^3.4.0":
- "integrity" "sha512-JZButFdZ1+/xAfpguQHoabIXkcqRRKpMrWKBkpEZZyxfY9C1DpADFB8PEqGSTeFr135SaTRfKqGKx5xSCLI7ZQ=="
- "resolved" "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.4.0.tgz"
- "version" "3.4.0"
+ version "3.4.0"
+ resolved "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.4.0.tgz"
+ integrity sha512-JZButFdZ1+/xAfpguQHoabIXkcqRRKpMrWKBkpEZZyxfY9C1DpADFB8PEqGSTeFr135SaTRfKqGKx5xSCLI7ZQ==
"@emotion/babel-plugin@^11.3.0":
- "integrity" "sha512-6mGSCWi9UzXut/ZAN6lGFu33wGR3SJisNl3c0tvlmb8XChH1b2SUvxvnOh7hvLpqyRdHHU9AiazV3Cwbk5SXKQ=="
- "resolved" "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.7.2.tgz"
- "version" "11.7.2"
+ version "11.7.2"
+ resolved "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.7.2.tgz"
+ integrity sha512-6mGSCWi9UzXut/ZAN6lGFu33wGR3SJisNl3c0tvlmb8XChH1b2SUvxvnOh7hvLpqyRdHHU9AiazV3Cwbk5SXKQ==
dependencies:
"@babel/helper-module-imports" "^7.12.13"
"@babel/plugin-syntax-jsx" "^7.12.13"
@@ -773,62 +773,62 @@
"@emotion/hash" "^0.8.0"
"@emotion/memoize" "^0.7.5"
"@emotion/serialize" "^1.0.2"
- "babel-plugin-macros" "^2.6.1"
- "convert-source-map" "^1.5.0"
- "escape-string-regexp" "^4.0.0"
- "find-root" "^1.1.0"
- "source-map" "^0.5.7"
- "stylis" "4.0.13"
+ babel-plugin-macros "^2.6.1"
+ convert-source-map "^1.5.0"
+ escape-string-regexp "^4.0.0"
+ find-root "^1.1.0"
+ source-map "^0.5.7"
+ stylis "4.0.13"
"@emotion/cache@^11.7.1":
- "integrity" "sha512-r65Zy4Iljb8oyjtLeCuBH8Qjiy107dOYC6SJq7g7GV5UCQWMObY4SJDPGFjiiVpPrOJ2hmJOoBiYTC7hwx9E2A=="
- "resolved" "https://registry.npmjs.org/@emotion/cache/-/cache-11.7.1.tgz"
- "version" "11.7.1"
+ version "11.7.1"
+ resolved "https://registry.npmjs.org/@emotion/cache/-/cache-11.7.1.tgz"
+ integrity sha512-r65Zy4Iljb8oyjtLeCuBH8Qjiy107dOYC6SJq7g7GV5UCQWMObY4SJDPGFjiiVpPrOJ2hmJOoBiYTC7hwx9E2A==
dependencies:
"@emotion/memoize" "^0.7.4"
"@emotion/sheet" "^1.1.0"
"@emotion/utils" "^1.0.0"
"@emotion/weak-memoize" "^0.2.5"
- "stylis" "4.0.13"
+ stylis "4.0.13"
"@emotion/core@^11.0.0":
- "integrity" "sha512-w4sE3AmHmyG6RDKf6mIbtHpgJUSJ2uGvPQb8VXFL7hFjMPibE8IiehG8cMX3Ztm4svfCQV6KqusQbeIOkurBcA=="
- "resolved" "https://registry.npmjs.org/@emotion/core/-/core-11.0.0.tgz"
- "version" "11.0.0"
+ version "11.0.0"
+ resolved "https://registry.npmjs.org/@emotion/core/-/core-11.0.0.tgz"
+ integrity sha512-w4sE3AmHmyG6RDKf6mIbtHpgJUSJ2uGvPQb8VXFL7hFjMPibE8IiehG8cMX3Ztm4svfCQV6KqusQbeIOkurBcA==
"@emotion/hash@^0.8.0":
- "integrity" "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow=="
- "resolved" "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz"
- "version" "0.8.0"
+ version "0.8.0"
+ resolved "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz"
+ integrity sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==
"@emotion/is-prop-valid@^0.8.2":
- "integrity" "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA=="
- "resolved" "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz"
- "version" "0.8.8"
+ version "0.8.8"
+ resolved "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz"
+ integrity sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==
dependencies:
"@emotion/memoize" "0.7.4"
"@emotion/is-prop-valid@^1.1.1":
- "integrity" "sha512-bW1Tos67CZkOURLc0OalnfxtSXQJMrAMV0jZTVGJUPSOd4qgjF3+tTD5CwJM13PHA8cltGW1WGbbvV9NpvUZPw=="
- "resolved" "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.1.1.tgz"
- "version" "1.1.1"
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.1.1.tgz"
+ integrity sha512-bW1Tos67CZkOURLc0OalnfxtSXQJMrAMV0jZTVGJUPSOd4qgjF3+tTD5CwJM13PHA8cltGW1WGbbvV9NpvUZPw==
dependencies:
"@emotion/memoize" "^0.7.4"
"@emotion/memoize@^0.7.4", "@emotion/memoize@^0.7.5":
- "integrity" "sha512-igX9a37DR2ZPGYtV6suZ6whr8pTFtyHL3K/oLUotxpSVO2ASaprmAe2Dkq7tBo7CRY7MMDrAa9nuQP9/YG8FxQ=="
- "resolved" "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.5.tgz"
- "version" "0.7.5"
+ version "0.7.5"
+ resolved "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.5.tgz"
+ integrity sha512-igX9a37DR2ZPGYtV6suZ6whr8pTFtyHL3K/oLUotxpSVO2ASaprmAe2Dkq7tBo7CRY7MMDrAa9nuQP9/YG8FxQ==
"@emotion/memoize@0.7.4":
- "integrity" "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw=="
- "resolved" "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz"
- "version" "0.7.4"
+ version "0.7.4"
+ resolved "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz"
+ integrity sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==
"@emotion/react@^11.0.0", "@emotion/react@^11.0.0-rc.0", "@emotion/react@^11.7.1", "@emotion/react@>=10.0.35":
- "integrity" "sha512-DV2Xe3yhkF1yT4uAUoJcYL1AmrnO5SVsdfvu+fBuS7IbByDeTVx9+wFmvx9Idzv7/78+9Mgx2Hcmr7Fex3tIyw=="
- "resolved" "https://registry.npmjs.org/@emotion/react/-/react-11.7.1.tgz"
- "version" "11.7.1"
+ version "11.7.1"
+ resolved "https://registry.npmjs.org/@emotion/react/-/react-11.7.1.tgz"
+ integrity sha512-DV2Xe3yhkF1yT4uAUoJcYL1AmrnO5SVsdfvu+fBuS7IbByDeTVx9+wFmvx9Idzv7/78+9Mgx2Hcmr7Fex3tIyw==
dependencies:
"@babel/runtime" "^7.13.10"
"@emotion/cache" "^11.7.1"
@@ -836,28 +836,28 @@
"@emotion/sheet" "^1.1.0"
"@emotion/utils" "^1.0.0"
"@emotion/weak-memoize" "^0.2.5"
- "hoist-non-react-statics" "^3.3.1"
+ hoist-non-react-statics "^3.3.1"
"@emotion/serialize@^1.0.2":
- "integrity" "sha512-95MgNJ9+/ajxU7QIAruiOAdYNjxZX7G2mhgrtDWswA21VviYIRP1R5QilZ/bDY42xiKsaktP4egJb3QdYQZi1A=="
- "resolved" "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.0.2.tgz"
- "version" "1.0.2"
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.0.2.tgz"
+ integrity sha512-95MgNJ9+/ajxU7QIAruiOAdYNjxZX7G2mhgrtDWswA21VviYIRP1R5QilZ/bDY42xiKsaktP4egJb3QdYQZi1A==
dependencies:
"@emotion/hash" "^0.8.0"
"@emotion/memoize" "^0.7.4"
"@emotion/unitless" "^0.7.5"
"@emotion/utils" "^1.0.0"
- "csstype" "^3.0.2"
+ csstype "^3.0.2"
"@emotion/sheet@^1.1.0":
- "integrity" "sha512-u0AX4aSo25sMAygCuQTzS+HsImZFuS8llY8O7b9MDRzbJM0kVJlAz6KNDqcG7pOuQZJmj/8X/rAW+66kMnMW+g=="
- "resolved" "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.1.0.tgz"
- "version" "1.1.0"
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.1.0.tgz"
+ integrity sha512-u0AX4aSo25sMAygCuQTzS+HsImZFuS8llY8O7b9MDRzbJM0kVJlAz6KNDqcG7pOuQZJmj/8X/rAW+66kMnMW+g==
"@emotion/styled@^11.0.0", "@emotion/styled@^11.6.0":
- "integrity" "sha512-mxVtVyIOTmCAkFbwIp+nCjTXJNgcz4VWkOYQro87jE2QBTydnkiYusMrRGFtzuruiGK4dDaNORk4gH049iiQuw=="
- "resolved" "https://registry.npmjs.org/@emotion/styled/-/styled-11.6.0.tgz"
- "version" "11.6.0"
+ version "11.6.0"
+ resolved "https://registry.npmjs.org/@emotion/styled/-/styled-11.6.0.tgz"
+ integrity sha512-mxVtVyIOTmCAkFbwIp+nCjTXJNgcz4VWkOYQro87jE2QBTydnkiYusMrRGFtzuruiGK4dDaNORk4gH049iiQuw==
dependencies:
"@babel/runtime" "^7.13.10"
"@emotion/babel-plugin" "^11.3.0"
@@ -866,1022 +866,1022 @@
"@emotion/utils" "^1.0.0"
"@emotion/unitless@^0.7.5":
- "integrity" "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg=="
- "resolved" "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz"
- "version" "0.7.5"
+ version "0.7.5"
+ resolved "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz"
+ integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==
"@emotion/utils@^1.0.0":
- "integrity" "sha512-mQC2b3XLDs6QCW+pDQDiyO/EdGZYOygE8s5N5rrzjSI4M3IejPE/JPndCBwRT9z982aqQNi6beWs1UeayrQxxA=="
- "resolved" "https://registry.npmjs.org/@emotion/utils/-/utils-1.0.0.tgz"
- "version" "1.0.0"
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/@emotion/utils/-/utils-1.0.0.tgz"
+ integrity sha512-mQC2b3XLDs6QCW+pDQDiyO/EdGZYOygE8s5N5rrzjSI4M3IejPE/JPndCBwRT9z982aqQNi6beWs1UeayrQxxA==
"@emotion/weak-memoize@^0.2.5":
- "integrity" "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA=="
- "resolved" "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz"
- "version" "0.2.5"
+ version "0.2.5"
+ resolved "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz"
+ integrity sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==
"@graphql-typed-document-node/core@^3.1.0":
- "integrity" "sha512-NQ17ii0rK1b34VZonlmT2QMJFI70m0TRwbknO/ihlbatXyaktDhN/98vBiUU6kNBPljqGqyIrl2T4nY2RpFANg=="
- "resolved" "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.1.1.tgz"
- "version" "3.1.1"
+ version "3.1.1"
+ resolved "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.1.1.tgz"
+ integrity sha512-NQ17ii0rK1b34VZonlmT2QMJFI70m0TRwbknO/ihlbatXyaktDhN/98vBiUU6kNBPljqGqyIrl2T4nY2RpFANg==
"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2":
- "integrity" "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ=="
- "resolved" "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz"
- "version" "0.3.3"
+ version "0.3.3"
+ resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz"
+ integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==
dependencies:
"@jridgewell/set-array" "^1.0.1"
"@jridgewell/sourcemap-codec" "^1.4.10"
"@jridgewell/trace-mapping" "^0.3.9"
"@jridgewell/resolve-uri@^3.1.0":
- "integrity" "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA=="
- "resolved" "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz"
- "version" "3.1.1"
+ version "3.1.1"
+ resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz"
+ integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==
"@jridgewell/set-array@^1.0.1":
- "integrity" "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw=="
- "resolved" "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz"
- "version" "1.1.2"
+ version "1.1.2"
+ resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz"
+ integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==
"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14":
- "integrity" "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg=="
- "resolved" "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz"
- "version" "1.4.15"
+ version "1.4.15"
+ resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz"
+ integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==
"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9":
- "integrity" "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q=="
- "resolved" "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz"
- "version" "0.3.20"
+ version "0.3.20"
+ resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz"
+ integrity sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==
dependencies:
"@jridgewell/resolve-uri" "^3.1.0"
"@jridgewell/sourcemap-codec" "^1.4.14"
"@popperjs/core@^2.9.3":
- "integrity" "sha512-zrsUxjLOKAzdewIDRWy9nsV1GQsKBCWaGwsZQlCgr6/q+vjyZhFgqedLfFBuI9anTPEUT4APq9Mu0SZBTzIcGQ=="
- "resolved" "https://registry.npmjs.org/@popperjs/core/-/core-2.11.0.tgz"
- "version" "2.11.0"
+ version "2.11.0"
+ resolved "https://registry.npmjs.org/@popperjs/core/-/core-2.11.0.tgz"
+ integrity sha512-zrsUxjLOKAzdewIDRWy9nsV1GQsKBCWaGwsZQlCgr6/q+vjyZhFgqedLfFBuI9anTPEUT4APq9Mu0SZBTzIcGQ==
"@reach/alert@0.13.2":
- "integrity" "sha512-LDz83AXCrClyq/MWe+0vaZfHp1Ytqn+kgL5VxG7rirUvmluWaj/snxzfNPWn0Ma4K2YENmXXRC/iHt5X95SqIg=="
- "resolved" "https://registry.npmjs.org/@reach/alert/-/alert-0.13.2.tgz"
- "version" "0.13.2"
+ version "0.13.2"
+ resolved "https://registry.npmjs.org/@reach/alert/-/alert-0.13.2.tgz"
+ integrity sha512-LDz83AXCrClyq/MWe+0vaZfHp1Ytqn+kgL5VxG7rirUvmluWaj/snxzfNPWn0Ma4K2YENmXXRC/iHt5X95SqIg==
dependencies:
"@reach/utils" "0.13.2"
"@reach/visually-hidden" "0.13.2"
- "prop-types" "^15.7.2"
- "tslib" "^2.1.0"
+ prop-types "^15.7.2"
+ tslib "^2.1.0"
"@reach/utils@0.13.2":
- "integrity" "sha512-3ir6cN60zvUrwjOJu7C6jec/samqAeyAB12ZADK+qjnmQPdzSYldrFWwDVV5H0WkhbYXR3uh+eImu13hCetNPQ=="
- "resolved" "https://registry.npmjs.org/@reach/utils/-/utils-0.13.2.tgz"
- "version" "0.13.2"
+ version "0.13.2"
+ resolved "https://registry.npmjs.org/@reach/utils/-/utils-0.13.2.tgz"
+ integrity sha512-3ir6cN60zvUrwjOJu7C6jec/samqAeyAB12ZADK+qjnmQPdzSYldrFWwDVV5H0WkhbYXR3uh+eImu13hCetNPQ==
dependencies:
"@types/warning" "^3.0.0"
- "tslib" "^2.1.0"
- "warning" "^4.0.3"
+ tslib "^2.1.0"
+ warning "^4.0.3"
"@reach/visually-hidden@0.13.2":
- "integrity" "sha512-sPZwNS0/duOuG0mYwE5DmgEAzW9VhgU3aIt1+mrfT/xiT9Cdncqke+kRBQgU708q/Ttm9tWsoHni03nn/SuPTQ=="
- "resolved" "https://registry.npmjs.org/@reach/visually-hidden/-/visually-hidden-0.13.2.tgz"
- "version" "0.13.2"
+ version "0.13.2"
+ resolved "https://registry.npmjs.org/@reach/visually-hidden/-/visually-hidden-0.13.2.tgz"
+ integrity sha512-sPZwNS0/duOuG0mYwE5DmgEAzW9VhgU3aIt1+mrfT/xiT9Cdncqke+kRBQgU708q/Ttm9tWsoHni03nn/SuPTQ==
dependencies:
- "prop-types" "^15.7.2"
- "tslib" "^2.1.0"
+ prop-types "^15.7.2"
+ tslib "^2.1.0"
"@types/history@*":
- "integrity" "sha512-MUc6zSmU3tEVnkQ78q0peeEjKWPUADMlC/t++2bI8WnAG2tvYRPIgHG8lWkXwqc8MsUF6Z2MOf+Mh5sazOmhiQ=="
- "resolved" "https://registry.npmjs.org/@types/history/-/history-4.7.9.tgz"
- "version" "4.7.9"
+ version "4.7.9"
+ resolved "https://registry.npmjs.org/@types/history/-/history-4.7.9.tgz"
+ integrity sha512-MUc6zSmU3tEVnkQ78q0peeEjKWPUADMlC/t++2bI8WnAG2tvYRPIgHG8lWkXwqc8MsUF6Z2MOf+Mh5sazOmhiQ==
"@types/lodash.mergewith@4.6.6":
- "integrity" "sha512-RY/8IaVENjG19rxTZu9Nukqh0W2UrYgmBj5sdns4hWRZaV8PqR7wIKHFKzvOTjo4zVRV7sVI+yFhAJql12Kfqg=="
- "resolved" "https://registry.npmjs.org/@types/lodash.mergewith/-/lodash.mergewith-4.6.6.tgz"
- "version" "4.6.6"
+ version "4.6.6"
+ resolved "https://registry.npmjs.org/@types/lodash.mergewith/-/lodash.mergewith-4.6.6.tgz"
+ integrity sha512-RY/8IaVENjG19rxTZu9Nukqh0W2UrYgmBj5sdns4hWRZaV8PqR7wIKHFKzvOTjo4zVRV7sVI+yFhAJql12Kfqg==
dependencies:
"@types/lodash" "*"
"@types/lodash@*":
- "integrity" "sha512-0d5Wd09ItQWH1qFbEyQ7oTQ3GZrMfth5JkbN3EvTKLXcHLRDSXeLnlvlOn0wvxVIwK5o2M8JzP/OWz7T3NRsbw=="
- "resolved" "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.178.tgz"
- "version" "4.14.178"
+ version "4.14.178"
+ resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.178.tgz"
+ integrity sha512-0d5Wd09ItQWH1qFbEyQ7oTQ3GZrMfth5JkbN3EvTKLXcHLRDSXeLnlvlOn0wvxVIwK5o2M8JzP/OWz7T3NRsbw==
"@types/parse-json@^4.0.0":
- "integrity" "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA=="
- "resolved" "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz"
- "version" "4.0.0"
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz"
+ integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==
"@types/prop-types@*":
- "integrity" "sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ=="
- "resolved" "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.4.tgz"
- "version" "15.7.4"
+ version "15.7.4"
+ resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.4.tgz"
+ integrity sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ==
"@types/react-dom@^17.0.11":
- "integrity" "sha512-f96K3k+24RaLGVu/Y2Ng3e1EbZ8/cVJvypZWd7cy0ofCBaf2lcM46xNhycMZ2xGwbBjRql7hOlZ+e2WlJ5MH3Q=="
- "resolved" "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.11.tgz"
- "version" "17.0.11"
+ version "17.0.11"
+ resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.11.tgz"
+ integrity sha512-f96K3k+24RaLGVu/Y2Ng3e1EbZ8/cVJvypZWd7cy0ofCBaf2lcM46xNhycMZ2xGwbBjRql7hOlZ+e2WlJ5MH3Q==
dependencies:
"@types/react" "*"
"@types/react-email-editor@^1.1.7":
- "integrity" "sha512-OURTAgaE9pjA6KiU97k13fPdoglI1ZyowUuZ0nu5tTSyrw5PiZoYzYEf9y25YTjmw/ohxT5yqoP0tt+AjSh1qQ=="
- "resolved" "https://registry.npmjs.org/@types/react-email-editor/-/react-email-editor-1.1.7.tgz"
- "version" "1.1.7"
+ version "1.1.7"
+ resolved "https://registry.npmjs.org/@types/react-email-editor/-/react-email-editor-1.1.7.tgz"
+ integrity sha512-OURTAgaE9pjA6KiU97k13fPdoglI1ZyowUuZ0nu5tTSyrw5PiZoYzYEf9y25YTjmw/ohxT5yqoP0tt+AjSh1qQ==
dependencies:
"@types/react" "*"
"@types/react-router-dom@^5.3.2":
- "integrity" "sha512-ELEYRUie2czuJzaZ5+ziIp9Hhw+juEw8b7C11YNA4QdLCVbQ3qLi2l4aq8XnlqM7V31LZX8dxUuFUCrzHm6sqQ=="
- "resolved" "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.2.tgz"
- "version" "5.3.2"
+ version "5.3.2"
+ resolved "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.2.tgz"
+ integrity sha512-ELEYRUie2czuJzaZ5+ziIp9Hhw+juEw8b7C11YNA4QdLCVbQ3qLi2l4aq8XnlqM7V31LZX8dxUuFUCrzHm6sqQ==
dependencies:
"@types/history" "*"
"@types/react" "*"
"@types/react-router" "*"
"@types/react-router@*":
- "integrity" "sha512-RNSXOyb3VyRs/EOGmjBhhGKTbnN6fHWvy5FNLzWfOWOGjgVUKqJZXfpKzLmgoU8h6Hj8mpALj/mbXQASOb92wQ=="
- "resolved" "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.17.tgz"
- "version" "5.1.17"
+ version "5.1.17"
+ resolved "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.17.tgz"
+ integrity sha512-RNSXOyb3VyRs/EOGmjBhhGKTbnN6fHWvy5FNLzWfOWOGjgVUKqJZXfpKzLmgoU8h6Hj8mpALj/mbXQASOb92wQ==
dependencies:
"@types/history" "*"
"@types/react" "*"
"@types/react@*", "@types/react@^16.8.0 || ^17.0.0", "@types/react@^17.0.38":
- "integrity" "sha512-SI92X1IA+FMnP3qM5m4QReluXzhcmovhZnLNm3pyeQlooi02qI7sLiepEYqT678uNiyc25XfCqxREFpy3W7YhQ=="
- "resolved" "https://registry.npmjs.org/@types/react/-/react-17.0.38.tgz"
- "version" "17.0.38"
+ version "17.0.38"
+ resolved "https://registry.npmjs.org/@types/react/-/react-17.0.38.tgz"
+ integrity sha512-SI92X1IA+FMnP3qM5m4QReluXzhcmovhZnLNm3pyeQlooi02qI7sLiepEYqT678uNiyc25XfCqxREFpy3W7YhQ==
dependencies:
"@types/prop-types" "*"
"@types/scheduler" "*"
- "csstype" "^3.0.2"
+ csstype "^3.0.2"
"@types/scheduler@*":
- "integrity" "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew=="
- "resolved" "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz"
- "version" "0.16.2"
+ version "0.16.2"
+ resolved "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz"
+ integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==
"@types/warning@^3.0.0":
- "integrity" "sha1-DSUBJorY+ZYrdA04fEZU9fjiPlI="
- "resolved" "https://registry.npmjs.org/@types/warning/-/warning-3.0.0.tgz"
- "version" "3.0.0"
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/@types/warning/-/warning-3.0.0.tgz"
+ integrity sha1-DSUBJorY+ZYrdA04fEZU9fjiPlI=
"@urql/core@^2.3.6":
- "integrity" "sha512-PUxhtBh7/8167HJK6WqBv6Z0piuiaZHQGYbhwpNL9aIQmLROPEdaUYkY4wh45wPQXcTpnd11l0q3Pw+TI11pdw=="
- "resolved" "https://registry.npmjs.org/@urql/core/-/core-2.3.6.tgz"
- "version" "2.3.6"
+ version "2.3.6"
+ resolved "https://registry.npmjs.org/@urql/core/-/core-2.3.6.tgz"
+ integrity sha512-PUxhtBh7/8167HJK6WqBv6Z0piuiaZHQGYbhwpNL9aIQmLROPEdaUYkY4wh45wPQXcTpnd11l0q3Pw+TI11pdw==
dependencies:
"@graphql-typed-document-node/core" "^3.1.0"
- "wonka" "^4.0.14"
+ wonka "^4.0.14"
-"ansi-styles@^3.2.1":
- "integrity" "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="
- "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz"
- "version" "3.2.1"
+ansi-styles@^3.2.1:
+ version "3.2.1"
+ resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz"
+ integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
dependencies:
- "color-convert" "^1.9.0"
+ color-convert "^1.9.0"
-"aria-hidden@^1.1.1":
- "integrity" "sha512-RhVWFtKH5BiGMycI72q2RAFMLQi8JP9bLuQXgR5a8Znp7P5KOIADSJeyfI8PCVxLEp067B2HbP5JIiI/PXIZeA=="
- "resolved" "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.1.3.tgz"
- "version" "1.1.3"
+aria-hidden@^1.1.1:
+ version "1.1.3"
+ resolved "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.1.3.tgz"
+ integrity sha512-RhVWFtKH5BiGMycI72q2RAFMLQi8JP9bLuQXgR5a8Znp7P5KOIADSJeyfI8PCVxLEp067B2HbP5JIiI/PXIZeA==
dependencies:
- "tslib" "^1.0.0"
+ tslib "^1.0.0"
-"asap@~2.0.3":
- "integrity" "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA=="
- "resolved" "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz"
- "version" "2.0.6"
+asap@~2.0.3:
+ version "2.0.6"
+ resolved "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz"
+ integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==
-"attr-accept@^2.2.2":
- "integrity" "sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg=="
- "resolved" "https://registry.npmjs.org/attr-accept/-/attr-accept-2.2.2.tgz"
- "version" "2.2.2"
+attr-accept@^2.2.2:
+ version "2.2.2"
+ resolved "https://registry.npmjs.org/attr-accept/-/attr-accept-2.2.2.tgz"
+ integrity sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg==
-"babel-plugin-macros@^2.6.1":
- "integrity" "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg=="
- "resolved" "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz"
- "version" "2.8.0"
+babel-plugin-macros@^2.6.1:
+ version "2.8.0"
+ resolved "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz"
+ integrity sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==
dependencies:
"@babel/runtime" "^7.7.2"
- "cosmiconfig" "^6.0.0"
- "resolve" "^1.12.0"
-
-"browserslist@^4.21.9", "browserslist@>= 4.21.0":
- "integrity" "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ=="
- "resolved" "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz"
- "version" "4.22.1"
- dependencies:
- "caniuse-lite" "^1.0.30001541"
- "electron-to-chromium" "^1.4.535"
- "node-releases" "^2.0.13"
- "update-browserslist-db" "^1.0.13"
-
-"callsites@^3.0.0":
- "integrity" "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="
- "resolved" "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz"
- "version" "3.1.0"
-
-"caniuse-lite@^1.0.30001541":
- "integrity" "sha512-NTt0DNoKe958Q0BE0j0c1V9jbUzhBxHIEJy7asmGrpE0yG63KTV7PLHPnK2E1O9RsQrQ081I3NLuXGS6zht3cw=="
- "resolved" "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001561.tgz"
- "version" "1.0.30001561"
-
-"chalk@^2.4.2":
- "integrity" "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="
- "resolved" "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz"
- "version" "2.4.2"
- dependencies:
- "ansi-styles" "^3.2.1"
- "escape-string-regexp" "^1.0.5"
- "supports-color" "^5.3.0"
-
-"classnames@^2.2.6":
- "integrity" "sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA=="
- "resolved" "https://registry.npmjs.org/classnames/-/classnames-2.3.1.tgz"
- "version" "2.3.1"
-
-"color-convert@^1.9.0":
- "integrity" "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="
- "resolved" "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz"
- "version" "1.9.3"
- dependencies:
- "color-name" "1.1.3"
-
-"color-name@1.1.3":
- "integrity" "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
- "resolved" "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz"
- "version" "1.1.3"
-
-"compute-scroll-into-view@1.0.14":
- "integrity" "sha512-mKDjINe3tc6hGelUMNDzuhorIUZ7kS7BwyY0r2wQd2HOH2tRuJykiC06iSEX8y1TuhNzvz4GcJnK16mM2J1NMQ=="
- "resolved" "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.14.tgz"
- "version" "1.0.14"
-
-"convert-source-map@^1.5.0":
- "integrity" "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA=="
- "resolved" "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz"
- "version" "1.8.0"
- dependencies:
- "safe-buffer" "~5.1.1"
-
-"convert-source-map@^2.0.0":
- "integrity" "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="
- "resolved" "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz"
- "version" "2.0.0"
-
-"copy-to-clipboard@3.3.1":
- "integrity" "sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw=="
- "resolved" "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.1.tgz"
- "version" "3.3.1"
- dependencies:
- "toggle-selection" "^1.0.6"
-
-"core-js@^3.6.4":
- "integrity" "sha512-XeBzWI6QL3nJQiHmdzbAOiMYqjrb7hwU7A39Qhvd/POSa/t9E1AeZyEZx3fNvp/vtM8zXwhoL0FsiS0hD0pruQ=="
- "resolved" "https://registry.npmjs.org/core-js/-/core-js-3.33.2.tgz"
- "version" "3.33.2"
-
-"cosmiconfig@^6.0.0":
- "integrity" "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg=="
- "resolved" "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz"
- "version" "6.0.0"
+ cosmiconfig "^6.0.0"
+ resolve "^1.12.0"
+
+browserslist@^4.21.9, "browserslist@>= 4.21.0":
+ version "4.22.1"
+ resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz"
+ integrity sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==
+ dependencies:
+ caniuse-lite "^1.0.30001541"
+ electron-to-chromium "^1.4.535"
+ node-releases "^2.0.13"
+ update-browserslist-db "^1.0.13"
+
+callsites@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz"
+ integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
+
+caniuse-lite@^1.0.30001541:
+ version "1.0.30001561"
+ resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001561.tgz"
+ integrity sha512-NTt0DNoKe958Q0BE0j0c1V9jbUzhBxHIEJy7asmGrpE0yG63KTV7PLHPnK2E1O9RsQrQ081I3NLuXGS6zht3cw==
+
+chalk@^2.4.2:
+ version "2.4.2"
+ resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz"
+ integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
+ dependencies:
+ ansi-styles "^3.2.1"
+ escape-string-regexp "^1.0.5"
+ supports-color "^5.3.0"
+
+classnames@^2.2.6:
+ version "2.3.1"
+ resolved "https://registry.npmjs.org/classnames/-/classnames-2.3.1.tgz"
+ integrity sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==
+
+color-convert@^1.9.0:
+ version "1.9.3"
+ resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz"
+ integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
+ dependencies:
+ color-name "1.1.3"
+
+color-name@1.1.3:
+ version "1.1.3"
+ resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz"
+ integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
+
+compute-scroll-into-view@1.0.14:
+ version "1.0.14"
+ resolved "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.14.tgz"
+ integrity sha512-mKDjINe3tc6hGelUMNDzuhorIUZ7kS7BwyY0r2wQd2HOH2tRuJykiC06iSEX8y1TuhNzvz4GcJnK16mM2J1NMQ==
+
+convert-source-map@^1.5.0:
+ version "1.8.0"
+ resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz"
+ integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==
+ dependencies:
+ safe-buffer "~5.1.1"
+
+convert-source-map@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz"
+ integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==
+
+copy-to-clipboard@3.3.1:
+ version "3.3.1"
+ resolved "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.1.tgz"
+ integrity sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw==
+ dependencies:
+ toggle-selection "^1.0.6"
+
+core-js@^3.6.4:
+ version "3.33.2"
+ resolved "https://registry.npmjs.org/core-js/-/core-js-3.33.2.tgz"
+ integrity sha512-XeBzWI6QL3nJQiHmdzbAOiMYqjrb7hwU7A39Qhvd/POSa/t9E1AeZyEZx3fNvp/vtM8zXwhoL0FsiS0hD0pruQ==
+
+cosmiconfig@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz"
+ integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==
dependencies:
"@types/parse-json" "^4.0.0"
- "import-fresh" "^3.1.0"
- "parse-json" "^5.0.0"
- "path-type" "^4.0.0"
- "yaml" "^1.7.2"
-
-"cross-fetch@^3.0.4":
- "integrity" "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg=="
- "resolved" "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz"
- "version" "3.1.8"
- dependencies:
- "node-fetch" "^2.6.12"
-
-"css-box-model@1.2.1":
- "integrity" "sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw=="
- "resolved" "https://registry.npmjs.org/css-box-model/-/css-box-model-1.2.1.tgz"
- "version" "1.2.1"
- dependencies:
- "tiny-invariant" "^1.0.6"
-
-"csstype@^3.0.2", "csstype@^3.0.9":
- "integrity" "sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA=="
- "resolved" "https://registry.npmjs.org/csstype/-/csstype-3.0.10.tgz"
- "version" "3.0.10"
-
-"dayjs@^1.10.7":
- "integrity" "sha512-P6twpd70BcPK34K26uJ1KT3wlhpuOAPoMwJzpsIWUxHZ7wpmbdZL/hQqBDfz7hGurYSa5PhzdhDHtt319hL3ig=="
- "resolved" "https://registry.npmjs.org/dayjs/-/dayjs-1.10.7.tgz"
- "version" "1.10.7"
-
-"debounce@^1.2.1":
- "integrity" "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug=="
- "resolved" "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz"
- "version" "1.2.1"
-
-"debug@^4.1.0":
- "integrity" "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ=="
- "resolved" "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz"
- "version" "4.3.4"
- dependencies:
- "ms" "2.1.2"
-
-"detect-node-es@^1.1.0":
- "integrity" "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ=="
- "resolved" "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz"
- "version" "1.1.0"
-
-"draft-js@^0.10.x || ^0.11.x", "draft-js@^0.11.x":
- "integrity" "sha512-ne7yFfN4sEL82QPQEn80xnADR8/Q6ALVworbC5UOSzOvjffmYfFsr3xSZtxbIirti14R7Y33EZC5rivpLgIbsg=="
- "resolved" "https://registry.npmjs.org/draft-js/-/draft-js-0.11.7.tgz"
- "version" "0.11.7"
- dependencies:
- "fbjs" "^2.0.0"
- "immutable" "~3.7.4"
- "object-assign" "^4.1.1"
-
-"draftjs-utils@^0.10.2":
- "integrity" "sha512-EstHqr3R3JVcilJrBaO/A+01GvwwKmC7e4TCjC7S94ZeMh4IVmf60OuQXtHHpwItK8C2JCi3iljgN5KHkJboUg=="
- "resolved" "https://registry.npmjs.org/draftjs-utils/-/draftjs-utils-0.10.2.tgz"
- "version" "0.10.2"
-
-"electron-to-chromium@^1.4.535":
- "integrity" "sha512-6uhqWBIapTJUxgPTCHH9sqdbxIMPt7oXl0VcAL1kOtlU6aECdcMncCrX5Z7sHQ/invtrC9jUQUef7+HhO8vVFw=="
- "resolved" "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.581.tgz"
- "version" "1.4.581"
-
-"error-ex@^1.3.1":
- "integrity" "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g=="
- "resolved" "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz"
- "version" "1.3.2"
- dependencies:
- "is-arrayish" "^0.2.1"
-
-"esbuild-linux-64@0.14.9":
- "integrity" "sha512-WoEI+R6/PLZAxS7XagfQMFgRtLUi5cjqqU9VCfo3tnWmAXh/wt8QtUfCVVCcXVwZLS/RNvI19CtfjlrJU61nOg=="
- "resolved" "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.9.tgz"
- "version" "0.14.9"
-
-"esbuild@^0.14.9":
- "integrity" "sha512-uuT3kFsfUvzNW6I2RKKIHuCvutY/U9KFcAP6emUm98WvBhyhEr5vGkZLeN3r3vXfoykl+7xekAH8Ky09LXBd0Q=="
- "resolved" "https://registry.npmjs.org/esbuild/-/esbuild-0.14.9.tgz"
- "version" "0.14.9"
+ import-fresh "^3.1.0"
+ parse-json "^5.0.0"
+ path-type "^4.0.0"
+ yaml "^1.7.2"
+
+cross-fetch@^3.0.4:
+ version "3.1.8"
+ resolved "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz"
+ integrity sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==
+ dependencies:
+ node-fetch "^2.6.12"
+
+css-box-model@1.2.1:
+ version "1.2.1"
+ resolved "https://registry.npmjs.org/css-box-model/-/css-box-model-1.2.1.tgz"
+ integrity sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==
+ dependencies:
+ tiny-invariant "^1.0.6"
+
+csstype@^3.0.2, csstype@^3.0.9:
+ version "3.0.10"
+ resolved "https://registry.npmjs.org/csstype/-/csstype-3.0.10.tgz"
+ integrity sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA==
+
+dayjs@^1.10.7:
+ version "1.10.7"
+ resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.10.7.tgz"
+ integrity sha512-P6twpd70BcPK34K26uJ1KT3wlhpuOAPoMwJzpsIWUxHZ7wpmbdZL/hQqBDfz7hGurYSa5PhzdhDHtt319hL3ig==
+
+debounce@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz"
+ integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==
+
+debug@^4.1.0:
+ version "4.3.4"
+ resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz"
+ integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
+ dependencies:
+ ms "2.1.2"
+
+detect-node-es@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz"
+ integrity sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==
+
+"draft-js@^0.10.x || ^0.11.x", draft-js@^0.11.x:
+ version "0.11.7"
+ resolved "https://registry.npmjs.org/draft-js/-/draft-js-0.11.7.tgz"
+ integrity sha512-ne7yFfN4sEL82QPQEn80xnADR8/Q6ALVworbC5UOSzOvjffmYfFsr3xSZtxbIirti14R7Y33EZC5rivpLgIbsg==
+ dependencies:
+ fbjs "^2.0.0"
+ immutable "~3.7.4"
+ object-assign "^4.1.1"
+
+draftjs-utils@^0.10.2:
+ version "0.10.2"
+ resolved "https://registry.npmjs.org/draftjs-utils/-/draftjs-utils-0.10.2.tgz"
+ integrity sha512-EstHqr3R3JVcilJrBaO/A+01GvwwKmC7e4TCjC7S94ZeMh4IVmf60OuQXtHHpwItK8C2JCi3iljgN5KHkJboUg==
+
+electron-to-chromium@^1.4.535:
+ version "1.4.581"
+ resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.581.tgz"
+ integrity sha512-6uhqWBIapTJUxgPTCHH9sqdbxIMPt7oXl0VcAL1kOtlU6aECdcMncCrX5Z7sHQ/invtrC9jUQUef7+HhO8vVFw==
+
+error-ex@^1.3.1:
+ version "1.3.2"
+ resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz"
+ integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
+ dependencies:
+ is-arrayish "^0.2.1"
+
+esbuild-darwin-arm64@0.14.9:
+ version "0.14.9"
+ resolved "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.9.tgz"
+ integrity sha512-3ue+1T4FR5TaAu4/V1eFMG8Uwn0pgAwQZb/WwL1X78d5Cy8wOVQ67KNH1lsjU+y/9AcwMKZ9x0GGNxBB4a1Rbw==
+
+esbuild@^0.14.9:
+ version "0.14.9"
+ resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.14.9.tgz"
+ integrity sha512-uuT3kFsfUvzNW6I2RKKIHuCvutY/U9KFcAP6emUm98WvBhyhEr5vGkZLeN3r3vXfoykl+7xekAH8Ky09LXBd0Q==
optionalDependencies:
- "esbuild-android-arm64" "0.14.9"
- "esbuild-darwin-64" "0.14.9"
- "esbuild-darwin-arm64" "0.14.9"
- "esbuild-freebsd-64" "0.14.9"
- "esbuild-freebsd-arm64" "0.14.9"
- "esbuild-linux-32" "0.14.9"
- "esbuild-linux-64" "0.14.9"
- "esbuild-linux-arm" "0.14.9"
- "esbuild-linux-arm64" "0.14.9"
- "esbuild-linux-mips64le" "0.14.9"
- "esbuild-linux-ppc64le" "0.14.9"
- "esbuild-linux-s390x" "0.14.9"
- "esbuild-netbsd-64" "0.14.9"
- "esbuild-openbsd-64" "0.14.9"
- "esbuild-sunos-64" "0.14.9"
- "esbuild-windows-32" "0.14.9"
- "esbuild-windows-64" "0.14.9"
- "esbuild-windows-arm64" "0.14.9"
-
-"escalade@^3.1.1":
- "integrity" "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw=="
- "resolved" "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz"
- "version" "3.1.1"
-
-"escape-string-regexp@^1.0.5":
- "integrity" "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="
- "resolved" "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz"
- "version" "1.0.5"
-
-"escape-string-regexp@^4.0.0":
- "integrity" "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="
- "resolved" "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz"
- "version" "4.0.0"
-
-"fbjs-css-vars@^1.0.0":
- "integrity" "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ=="
- "resolved" "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz"
- "version" "1.0.2"
-
-"fbjs@^2.0.0":
- "integrity" "sha512-8XA8ny9ifxrAWlyhAbexXcs3rRMtxWcs3M0lctLfB49jRDHiaxj+Mo0XxbwE7nKZYzgCFoq64FS+WFd4IycPPQ=="
- "resolved" "https://registry.npmjs.org/fbjs/-/fbjs-2.0.0.tgz"
- "version" "2.0.0"
- dependencies:
- "core-js" "^3.6.4"
- "cross-fetch" "^3.0.4"
- "fbjs-css-vars" "^1.0.0"
- "loose-envify" "^1.0.0"
- "object-assign" "^4.1.0"
- "promise" "^7.1.1"
- "setimmediate" "^1.0.5"
- "ua-parser-js" "^0.7.18"
-
-"file-selector@^0.4.0":
- "integrity" "sha512-iACCiXeMYOvZqlF1kTiYINzgepRBymz1wwjiuup9u9nayhb6g4fSwiyJ/6adli+EPwrWtpgQAh2PoS7HukEGEg=="
- "resolved" "https://registry.npmjs.org/file-selector/-/file-selector-0.4.0.tgz"
- "version" "0.4.0"
- dependencies:
- "tslib" "^2.0.3"
-
-"find-root@^1.1.0":
- "integrity" "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng=="
- "resolved" "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz"
- "version" "1.1.0"
-
-"focus-lock@^0.9.1":
- "integrity" "sha512-YtHxjX7a0IC0ZACL5wsX8QdncXofWpGPNoVMuI/nZUrPGp6LmNI6+D5j0pPj+v8Kw5EpweA+T5yImK0rnWf7oQ=="
- "resolved" "https://registry.npmjs.org/focus-lock/-/focus-lock-0.9.2.tgz"
- "version" "0.9.2"
- dependencies:
- "tslib" "^2.0.3"
-
-"focus-visible@^5.2.0":
- "integrity" "sha512-Rwix9pBtC1Nuy5wysTmKy+UjbDJpIfg8eHjw0rjZ1mX4GNLz1Bmd16uDpI3Gk1i70Fgcs8Csg2lPm8HULFg9DQ=="
- "resolved" "https://registry.npmjs.org/focus-visible/-/focus-visible-5.2.0.tgz"
- "version" "5.2.0"
-
-"framer-motion@^5.5.5", "framer-motion@3.x || 4.x || 5.x":
- "integrity" "sha512-+LPAF5ddo02qKh+MK4h1ChwqUFvrLkK1NDWwrHy+MuCVmQDGgiFNHvwqOSklTDGkEtbio3dCOEDy23+ZyNAa9g=="
- "resolved" "https://registry.npmjs.org/framer-motion/-/framer-motion-5.5.5.tgz"
- "version" "5.5.5"
- dependencies:
- "framesync" "6.0.1"
- "hey-listen" "^1.0.8"
- "popmotion" "11.0.3"
- "react-merge-refs" "^1.1.0"
- "react-use-measure" "^2.1.1"
- "style-value-types" "5.0.0"
- "tslib" "^2.1.0"
+ esbuild-android-arm64 "0.14.9"
+ esbuild-darwin-64 "0.14.9"
+ esbuild-darwin-arm64 "0.14.9"
+ esbuild-freebsd-64 "0.14.9"
+ esbuild-freebsd-arm64 "0.14.9"
+ esbuild-linux-32 "0.14.9"
+ esbuild-linux-64 "0.14.9"
+ esbuild-linux-arm "0.14.9"
+ esbuild-linux-arm64 "0.14.9"
+ esbuild-linux-mips64le "0.14.9"
+ esbuild-linux-ppc64le "0.14.9"
+ esbuild-linux-s390x "0.14.9"
+ esbuild-netbsd-64 "0.14.9"
+ esbuild-openbsd-64 "0.14.9"
+ esbuild-sunos-64 "0.14.9"
+ esbuild-windows-32 "0.14.9"
+ esbuild-windows-64 "0.14.9"
+ esbuild-windows-arm64 "0.14.9"
+
+escalade@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz"
+ integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==
+
+escape-string-regexp@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz"
+ integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==
+
+escape-string-regexp@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz"
+ integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
+
+fbjs-css-vars@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz"
+ integrity sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==
+
+fbjs@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/fbjs/-/fbjs-2.0.0.tgz"
+ integrity sha512-8XA8ny9ifxrAWlyhAbexXcs3rRMtxWcs3M0lctLfB49jRDHiaxj+Mo0XxbwE7nKZYzgCFoq64FS+WFd4IycPPQ==
+ dependencies:
+ core-js "^3.6.4"
+ cross-fetch "^3.0.4"
+ fbjs-css-vars "^1.0.0"
+ loose-envify "^1.0.0"
+ object-assign "^4.1.0"
+ promise "^7.1.1"
+ setimmediate "^1.0.5"
+ ua-parser-js "^0.7.18"
+
+file-selector@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.npmjs.org/file-selector/-/file-selector-0.4.0.tgz"
+ integrity sha512-iACCiXeMYOvZqlF1kTiYINzgepRBymz1wwjiuup9u9nayhb6g4fSwiyJ/6adli+EPwrWtpgQAh2PoS7HukEGEg==
+ dependencies:
+ tslib "^2.0.3"
+
+find-root@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz"
+ integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==
+
+focus-lock@^0.9.1:
+ version "0.9.2"
+ resolved "https://registry.npmjs.org/focus-lock/-/focus-lock-0.9.2.tgz"
+ integrity sha512-YtHxjX7a0IC0ZACL5wsX8QdncXofWpGPNoVMuI/nZUrPGp6LmNI6+D5j0pPj+v8Kw5EpweA+T5yImK0rnWf7oQ==
+ dependencies:
+ tslib "^2.0.3"
+
+focus-visible@^5.2.0:
+ version "5.2.0"
+ resolved "https://registry.npmjs.org/focus-visible/-/focus-visible-5.2.0.tgz"
+ integrity sha512-Rwix9pBtC1Nuy5wysTmKy+UjbDJpIfg8eHjw0rjZ1mX4GNLz1Bmd16uDpI3Gk1i70Fgcs8Csg2lPm8HULFg9DQ==
+
+framer-motion@^5.5.5, "framer-motion@3.x || 4.x || 5.x":
+ version "5.5.5"
+ resolved "https://registry.npmjs.org/framer-motion/-/framer-motion-5.5.5.tgz"
+ integrity sha512-+LPAF5ddo02qKh+MK4h1ChwqUFvrLkK1NDWwrHy+MuCVmQDGgiFNHvwqOSklTDGkEtbio3dCOEDy23+ZyNAa9g==
+ dependencies:
+ framesync "6.0.1"
+ hey-listen "^1.0.8"
+ popmotion "11.0.3"
+ react-merge-refs "^1.1.0"
+ react-use-measure "^2.1.1"
+ style-value-types "5.0.0"
+ tslib "^2.1.0"
optionalDependencies:
"@emotion/is-prop-valid" "^0.8.2"
-"framesync@5.3.0":
- "integrity" "sha512-oc5m68HDO/tuK2blj7ZcdEBRx3p1PjrgHazL8GYEpvULhrtGIFbQArN6cQS2QhW8mitffaB+VYzMjDqBxxQeoA=="
- "resolved" "https://registry.npmjs.org/framesync/-/framesync-5.3.0.tgz"
- "version" "5.3.0"
+framesync@5.3.0:
+ version "5.3.0"
+ resolved "https://registry.npmjs.org/framesync/-/framesync-5.3.0.tgz"
+ integrity sha512-oc5m68HDO/tuK2blj7ZcdEBRx3p1PjrgHazL8GYEpvULhrtGIFbQArN6cQS2QhW8mitffaB+VYzMjDqBxxQeoA==
dependencies:
- "tslib" "^2.1.0"
+ tslib "^2.1.0"
-"framesync@6.0.1":
- "integrity" "sha512-fUY88kXvGiIItgNC7wcTOl0SNRCVXMKSWW2Yzfmn7EKNc+MpCzcz9DhdHcdjbrtN3c6R4H5dTY2jiCpPdysEjA=="
- "resolved" "https://registry.npmjs.org/framesync/-/framesync-6.0.1.tgz"
- "version" "6.0.1"
+framesync@6.0.1:
+ version "6.0.1"
+ resolved "https://registry.npmjs.org/framesync/-/framesync-6.0.1.tgz"
+ integrity sha512-fUY88kXvGiIItgNC7wcTOl0SNRCVXMKSWW2Yzfmn7EKNc+MpCzcz9DhdHcdjbrtN3c6R4H5dTY2jiCpPdysEjA==
dependencies:
- "tslib" "^2.1.0"
+ tslib "^2.1.0"
-"function-bind@^1.1.1":
- "integrity" "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
- "resolved" "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz"
- "version" "1.1.1"
+function-bind@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz"
+ integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
-"gensync@^1.0.0-beta.2":
- "integrity" "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="
- "resolved" "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz"
- "version" "1.0.0-beta.2"
+gensync@^1.0.0-beta.2:
+ version "1.0.0-beta.2"
+ resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz"
+ integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==
-"get-nonce@^1.0.0":
- "integrity" "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q=="
- "resolved" "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz"
- "version" "1.0.1"
+get-nonce@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz"
+ integrity sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==
-"globals@^11.1.0":
- "integrity" "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="
- "resolved" "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz"
- "version" "11.12.0"
+globals@^11.1.0:
+ version "11.12.0"
+ resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz"
+ integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
-"graphql@^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0", "graphql@^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0", "graphql@^16.2.0":
- "integrity" "sha512-MuQd7XXrdOcmfwuLwC2jNvx0n3rxIuNYOxUtiee5XOmfrWo613ar2U8pE7aHAKh8VwfpifubpD9IP+EdEAEOsA=="
- "resolved" "https://registry.npmjs.org/graphql/-/graphql-16.2.0.tgz"
- "version" "16.2.0"
+"graphql@^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0", "graphql@^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0", graphql@^16.2.0:
+ version "16.2.0"
+ resolved "https://registry.npmjs.org/graphql/-/graphql-16.2.0.tgz"
+ integrity sha512-MuQd7XXrdOcmfwuLwC2jNvx0n3rxIuNYOxUtiee5XOmfrWo613ar2U8pE7aHAKh8VwfpifubpD9IP+EdEAEOsA==
-"has-flag@^3.0.0":
- "integrity" "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="
- "resolved" "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz"
- "version" "3.0.0"
+has-flag@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz"
+ integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==
-"has@^1.0.3":
- "integrity" "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw=="
- "resolved" "https://registry.npmjs.org/has/-/has-1.0.3.tgz"
- "version" "1.0.3"
+has@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz"
+ integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
dependencies:
- "function-bind" "^1.1.1"
+ function-bind "^1.1.1"
-"hey-listen@^1.0.8":
- "integrity" "sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q=="
- "resolved" "https://registry.npmjs.org/hey-listen/-/hey-listen-1.0.8.tgz"
- "version" "1.0.8"
+hey-listen@^1.0.8:
+ version "1.0.8"
+ resolved "https://registry.npmjs.org/hey-listen/-/hey-listen-1.0.8.tgz"
+ integrity sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==
-"history@^5.2.0":
- "integrity" "sha512-uPSF6lAJb3nSePJ43hN3eKj1dTWpN9gMod0ZssbFTIsen+WehTmEadgL+kg78xLJFdRfrrC//SavDzmRVdE+Ig=="
- "resolved" "https://registry.npmjs.org/history/-/history-5.2.0.tgz"
- "version" "5.2.0"
+history@^5.2.0:
+ version "5.2.0"
+ resolved "https://registry.npmjs.org/history/-/history-5.2.0.tgz"
+ integrity sha512-uPSF6lAJb3nSePJ43hN3eKj1dTWpN9gMod0ZssbFTIsen+WehTmEadgL+kg78xLJFdRfrrC//SavDzmRVdE+Ig==
dependencies:
"@babel/runtime" "^7.7.6"
-"hoist-non-react-statics@^3.3.1":
- "integrity" "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw=="
- "resolved" "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz"
- "version" "3.3.2"
+hoist-non-react-statics@^3.3.1:
+ version "3.3.2"
+ resolved "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz"
+ integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==
dependencies:
- "react-is" "^16.7.0"
+ react-is "^16.7.0"
-"html-to-draftjs@^1.5.0":
- "integrity" "sha512-kggLXBNciKDwKf+KYsuE+V5gw4dZ7nHyGMX9m0wy7urzWjKGWyNFetmArRLvRV0VrxKN70WylFsJvMTJx02OBQ=="
- "resolved" "https://registry.npmjs.org/html-to-draftjs/-/html-to-draftjs-1.5.0.tgz"
- "version" "1.5.0"
+html-to-draftjs@^1.5.0:
+ version "1.5.0"
+ resolved "https://registry.npmjs.org/html-to-draftjs/-/html-to-draftjs-1.5.0.tgz"
+ integrity sha512-kggLXBNciKDwKf+KYsuE+V5gw4dZ7nHyGMX9m0wy7urzWjKGWyNFetmArRLvRV0VrxKN70WylFsJvMTJx02OBQ==
-"immutable@~3.7.4":
- "integrity" "sha512-AizQPcaofEtO11RZhPPHBOJRdo/20MKQF9mBLnVkBoyHi1/zXK8fzVdnEpSV9gxqtnh6Qomfp3F0xT5qP/vThw=="
- "resolved" "https://registry.npmjs.org/immutable/-/immutable-3.7.6.tgz"
- "version" "3.7.6"
+immutable@~3.7.4:
+ version "3.7.6"
+ resolved "https://registry.npmjs.org/immutable/-/immutable-3.7.6.tgz"
+ integrity sha512-AizQPcaofEtO11RZhPPHBOJRdo/20MKQF9mBLnVkBoyHi1/zXK8fzVdnEpSV9gxqtnh6Qomfp3F0xT5qP/vThw==
"immutable@3.x.x || 4.x.x":
- "integrity" "sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA=="
- "resolved" "https://registry.npmjs.org/immutable/-/immutable-4.3.4.tgz"
- "version" "4.3.4"
-
-"import-fresh@^3.1.0":
- "integrity" "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw=="
- "resolved" "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz"
- "version" "3.3.0"
- dependencies:
- "parent-module" "^1.0.0"
- "resolve-from" "^4.0.0"
-
-"invariant@^2.2.4":
- "integrity" "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA=="
- "resolved" "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz"
- "version" "2.2.4"
- dependencies:
- "loose-envify" "^1.0.0"
-
-"is-arrayish@^0.2.1":
- "integrity" "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0="
- "resolved" "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz"
- "version" "0.2.1"
-
-"is-core-module@^2.2.0":
- "integrity" "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw=="
- "resolved" "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz"
- "version" "2.8.0"
- dependencies:
- "has" "^1.0.3"
-
-"js-tokens@^3.0.0 || ^4.0.0", "js-tokens@^4.0.0":
- "integrity" "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
- "resolved" "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz"
- "version" "4.0.0"
-
-"jsesc@^2.5.1":
- "integrity" "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA=="
- "resolved" "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz"
- "version" "2.5.2"
-
-"json-parse-even-better-errors@^2.3.0":
- "integrity" "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="
- "resolved" "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz"
- "version" "2.3.1"
-
-"json5@^2.2.3":
- "integrity" "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="
- "resolved" "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz"
- "version" "2.2.3"
-
-"lines-and-columns@^1.1.6":
- "integrity" "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="
- "resolved" "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz"
- "version" "1.2.4"
-
-"linkify-it@^2.2.0":
- "integrity" "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw=="
- "resolved" "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz"
- "version" "2.2.0"
- dependencies:
- "uc.micro" "^1.0.1"
-
-"lodash.mergewith@4.6.2":
- "integrity" "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ=="
- "resolved" "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz"
- "version" "4.6.2"
-
-"lodash@^4.17.21":
- "integrity" "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
- "resolved" "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz"
- "version" "4.17.21"
-
-"loose-envify@^1.0.0", "loose-envify@^1.1.0", "loose-envify@^1.4.0":
- "integrity" "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q=="
- "resolved" "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz"
- "version" "1.4.0"
- dependencies:
- "js-tokens" "^3.0.0 || ^4.0.0"
-
-"lru-cache@^5.1.1":
- "integrity" "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="
- "resolved" "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz"
- "version" "5.1.1"
- dependencies:
- "yallist" "^3.0.2"
-
-"ms@2.1.2":
- "integrity" "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
- "resolved" "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz"
- "version" "2.1.2"
-
-"node-fetch@^2.6.12":
- "integrity" "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A=="
- "resolved" "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz"
- "version" "2.7.0"
- dependencies:
- "whatwg-url" "^5.0.0"
-
-"node-releases@^2.0.13":
- "integrity" "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ=="
- "resolved" "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz"
- "version" "2.0.13"
+ version "4.3.4"
+ resolved "https://registry.npmjs.org/immutable/-/immutable-4.3.4.tgz"
+ integrity sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==
+
+import-fresh@^3.1.0:
+ version "3.3.0"
+ resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz"
+ integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==
+ dependencies:
+ parent-module "^1.0.0"
+ resolve-from "^4.0.0"
+
+invariant@^2.2.4:
+ version "2.2.4"
+ resolved "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz"
+ integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==
+ dependencies:
+ loose-envify "^1.0.0"
+
+is-arrayish@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz"
+ integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=
+
+is-core-module@^2.2.0:
+ version "2.8.0"
+ resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz"
+ integrity sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==
+ dependencies:
+ has "^1.0.3"
+
+"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz"
+ integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
+
+jsesc@^2.5.1:
+ version "2.5.2"
+ resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz"
+ integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==
+
+json-parse-even-better-errors@^2.3.0:
+ version "2.3.1"
+ resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz"
+ integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==
+
+json5@^2.2.3:
+ version "2.2.3"
+ resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz"
+ integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==
+
+lines-and-columns@^1.1.6:
+ version "1.2.4"
+ resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz"
+ integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==
+
+linkify-it@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz"
+ integrity sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==
+ dependencies:
+ uc.micro "^1.0.1"
+
+lodash.mergewith@4.6.2:
+ version "4.6.2"
+ resolved "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz"
+ integrity sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==
+
+lodash@^4.17.21:
+ version "4.17.21"
+ resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz"
+ integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
+
+loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz"
+ integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
+ dependencies:
+ js-tokens "^3.0.0 || ^4.0.0"
+
+lru-cache@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz"
+ integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==
+ dependencies:
+ yallist "^3.0.2"
+
+ms@2.1.2:
+ version "2.1.2"
+ resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz"
+ integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
+
+node-fetch@^2.6.12:
+ version "2.7.0"
+ resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz"
+ integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==
+ dependencies:
+ whatwg-url "^5.0.0"
+
+node-releases@^2.0.13:
+ version "2.0.13"
+ resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz"
+ integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==
-"object-assign@^4.1.0", "object-assign@^4.1.1":
- "integrity" "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
- "resolved" "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz"
- "version" "4.1.1"
+object-assign@^4.1.0, object-assign@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz"
+ integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
-"parent-module@^1.0.0":
- "integrity" "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="
- "resolved" "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz"
- "version" "1.0.1"
- dependencies:
- "callsites" "^3.0.0"
+parent-module@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz"
+ integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==
+ dependencies:
+ callsites "^3.0.0"
-"parse-json@^5.0.0":
- "integrity" "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg=="
- "resolved" "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz"
- "version" "5.2.0"
+parse-json@^5.0.0:
+ version "5.2.0"
+ resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz"
+ integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==
dependencies:
"@babel/code-frame" "^7.0.0"
- "error-ex" "^1.3.1"
- "json-parse-even-better-errors" "^2.3.0"
- "lines-and-columns" "^1.1.6"
-
-"path-parse@^1.0.6":
- "integrity" "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
- "resolved" "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz"
- "version" "1.0.7"
-
-"path-type@^4.0.0":
- "integrity" "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="
- "resolved" "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz"
- "version" "4.0.0"
-
-"picocolors@^1.0.0":
- "integrity" "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
- "resolved" "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz"
- "version" "1.0.0"
-
-"popmotion@11.0.3":
- "integrity" "sha512-Y55FLdj3UxkR7Vl3s7Qr4e9m0onSnP8W7d/xQLsoJM40vs6UKHFdygs6SWryasTZYqugMjm3BepCF4CWXDiHgA=="
- "resolved" "https://registry.npmjs.org/popmotion/-/popmotion-11.0.3.tgz"
- "version" "11.0.3"
- dependencies:
- "framesync" "6.0.1"
- "hey-listen" "^1.0.8"
- "style-value-types" "5.0.0"
- "tslib" "^2.1.0"
-
-"prettier@2.7.1":
- "integrity" "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g=="
- "resolved" "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz"
- "version" "2.7.1"
-
-"promise@^7.1.1":
- "integrity" "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg=="
- "resolved" "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz"
- "version" "7.3.1"
- dependencies:
- "asap" "~2.0.3"
-
-"prop-types@^15.6.2", "prop-types@^15.7.2", "prop-types@^15.8.1":
- "integrity" "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg=="
- "resolved" "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz"
- "version" "15.8.1"
- dependencies:
- "loose-envify" "^1.4.0"
- "object-assign" "^4.1.1"
- "react-is" "^16.13.1"
-
-"react-clientside-effect@^1.2.5":
- "integrity" "sha512-2bL8qFW1TGBHozGGbVeyvnggRpMjibeZM2536AKNENLECutp2yfs44IL8Hmpn8qjFQ2K7A9PnYf3vc7aQq/cPA=="
- "resolved" "https://registry.npmjs.org/react-clientside-effect/-/react-clientside-effect-1.2.5.tgz"
- "version" "1.2.5"
+ error-ex "^1.3.1"
+ json-parse-even-better-errors "^2.3.0"
+ lines-and-columns "^1.1.6"
+
+path-parse@^1.0.6:
+ version "1.0.7"
+ resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz"
+ integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
+
+path-type@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz"
+ integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
+
+picocolors@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz"
+ integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
+
+popmotion@11.0.3:
+ version "11.0.3"
+ resolved "https://registry.npmjs.org/popmotion/-/popmotion-11.0.3.tgz"
+ integrity sha512-Y55FLdj3UxkR7Vl3s7Qr4e9m0onSnP8W7d/xQLsoJM40vs6UKHFdygs6SWryasTZYqugMjm3BepCF4CWXDiHgA==
+ dependencies:
+ framesync "6.0.1"
+ hey-listen "^1.0.8"
+ style-value-types "5.0.0"
+ tslib "^2.1.0"
+
+prettier@2.7.1:
+ version "2.7.1"
+ resolved "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz"
+ integrity sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==
+
+promise@^7.1.1:
+ version "7.3.1"
+ resolved "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz"
+ integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==
+ dependencies:
+ asap "~2.0.3"
+
+prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1:
+ version "15.8.1"
+ resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz"
+ integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==
+ dependencies:
+ loose-envify "^1.4.0"
+ object-assign "^4.1.1"
+ react-is "^16.13.1"
+
+react-clientside-effect@^1.2.5:
+ version "1.2.5"
+ resolved "https://registry.npmjs.org/react-clientside-effect/-/react-clientside-effect-1.2.5.tgz"
+ integrity sha512-2bL8qFW1TGBHozGGbVeyvnggRpMjibeZM2536AKNENLECutp2yfs44IL8Hmpn8qjFQ2K7A9PnYf3vc7aQq/cPA==
dependencies:
"@babel/runtime" "^7.12.13"
-"react-dom@^16.8.0 || 17.x", "react-dom@^17.0.2", "react-dom@>=0.14.0", "react-dom@>=16.13", "react-dom@>=16.8", "react-dom@>=16.8 || ^17.0.0", "react-dom@>=16.8.6", "react-dom@0.13.x || 0.14.x || ^15.0.0-0 || 15.x.x || ^16.0.0-0 || ^16.x.x || ^17.x.x || ^18.x.x":
- "integrity" "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA=="
- "resolved" "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz"
- "version" "17.0.2"
- dependencies:
- "loose-envify" "^1.1.0"
- "object-assign" "^4.1.1"
- "scheduler" "^0.20.2"
-
-"react-draft-wysiwyg@^1.15.0":
- "integrity" "sha512-p1cYZcWc6/ALFBVksbFoCM3b29fGQDlZLIMrXng0TU/UElxIOF2/AWWo4L5auIYVhmqKTZ0NkNjnXOzGGuxyeA=="
- "resolved" "https://registry.npmjs.org/react-draft-wysiwyg/-/react-draft-wysiwyg-1.15.0.tgz"
- "version" "1.15.0"
- dependencies:
- "classnames" "^2.2.6"
- "draftjs-utils" "^0.10.2"
- "html-to-draftjs" "^1.5.0"
- "linkify-it" "^2.2.0"
- "prop-types" "^15.7.2"
-
-"react-dropzone@^12.0.4":
- "integrity" "sha512-fcqHEYe1MzAghU6/Hz86lHDlBNsA+lO48nAcm7/wA+kIzwS6uuJbUG33tBZjksj7GAZ1iUQ6NHwjUURPmSGang=="
- "resolved" "https://registry.npmjs.org/react-dropzone/-/react-dropzone-12.0.4.tgz"
- "version" "12.0.4"
- dependencies:
- "attr-accept" "^2.2.2"
- "file-selector" "^0.4.0"
- "prop-types" "^15.8.1"
-
-"react-email-editor@^1.6.1":
- "integrity" "sha512-pEWpRmTY0ok03cwTGqEOoEldnzThhuRGTrcMnv8W3/jc5MTfcr9USU/IQ9HrVvFStLKoxYBIQnSKY+iCYWOtSQ=="
- "resolved" "https://registry.npmjs.org/react-email-editor/-/react-email-editor-1.6.1.tgz"
- "version" "1.6.1"
-
-"react-fast-compare@3.2.0":
- "integrity" "sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA=="
- "resolved" "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.0.tgz"
- "version" "3.2.0"
-
-"react-focus-lock@2.5.2":
- "integrity" "sha512-WzpdOnEqjf+/A3EH9opMZWauag7gV0BxFl+EY4ElA4qFqYsUsBLnmo2sELbN5OC30S16GAWMy16B9DLPpdJKAQ=="
- "resolved" "https://registry.npmjs.org/react-focus-lock/-/react-focus-lock-2.5.2.tgz"
- "version" "2.5.2"
+"react-dom@^16.8.0 || 17.x", react-dom@^17.0.2, react-dom@>=0.14.0, react-dom@>=16.13, react-dom@>=16.8, "react-dom@>=16.8 || ^17.0.0", react-dom@>=16.8.6, "react-dom@0.13.x || 0.14.x || ^15.0.0-0 || 15.x.x || ^16.0.0-0 || ^16.x.x || ^17.x.x || ^18.x.x":
+ version "17.0.2"
+ resolved "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz"
+ integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==
+ dependencies:
+ loose-envify "^1.1.0"
+ object-assign "^4.1.1"
+ scheduler "^0.20.2"
+
+react-draft-wysiwyg@^1.15.0:
+ version "1.15.0"
+ resolved "https://registry.npmjs.org/react-draft-wysiwyg/-/react-draft-wysiwyg-1.15.0.tgz"
+ integrity sha512-p1cYZcWc6/ALFBVksbFoCM3b29fGQDlZLIMrXng0TU/UElxIOF2/AWWo4L5auIYVhmqKTZ0NkNjnXOzGGuxyeA==
+ dependencies:
+ classnames "^2.2.6"
+ draftjs-utils "^0.10.2"
+ html-to-draftjs "^1.5.0"
+ linkify-it "^2.2.0"
+ prop-types "^15.7.2"
+
+react-dropzone@^12.0.4:
+ version "12.0.4"
+ resolved "https://registry.npmjs.org/react-dropzone/-/react-dropzone-12.0.4.tgz"
+ integrity sha512-fcqHEYe1MzAghU6/Hz86lHDlBNsA+lO48nAcm7/wA+kIzwS6uuJbUG33tBZjksj7GAZ1iUQ6NHwjUURPmSGang==
+ dependencies:
+ attr-accept "^2.2.2"
+ file-selector "^0.4.0"
+ prop-types "^15.8.1"
+
+react-email-editor@^1.6.1:
+ version "1.6.1"
+ resolved "https://registry.npmjs.org/react-email-editor/-/react-email-editor-1.6.1.tgz"
+ integrity sha512-pEWpRmTY0ok03cwTGqEOoEldnzThhuRGTrcMnv8W3/jc5MTfcr9USU/IQ9HrVvFStLKoxYBIQnSKY+iCYWOtSQ==
+
+react-fast-compare@3.2.0:
+ version "3.2.0"
+ resolved "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.0.tgz"
+ integrity sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA==
+
+react-focus-lock@2.5.2:
+ version "2.5.2"
+ resolved "https://registry.npmjs.org/react-focus-lock/-/react-focus-lock-2.5.2.tgz"
+ integrity sha512-WzpdOnEqjf+/A3EH9opMZWauag7gV0BxFl+EY4ElA4qFqYsUsBLnmo2sELbN5OC30S16GAWMy16B9DLPpdJKAQ==
dependencies:
"@babel/runtime" "^7.0.0"
- "focus-lock" "^0.9.1"
- "prop-types" "^15.6.2"
- "react-clientside-effect" "^1.2.5"
- "use-callback-ref" "^1.2.5"
- "use-sidecar" "^1.0.5"
-
-"react-icons@^4.3.1":
- "integrity" "sha512-cB10MXLTs3gVuXimblAdI71jrJx8njrJZmNMEMC+sQu5B/BIOmlsAjskdqpn81y8UBVEGuHODd7/ci5DvoSzTQ=="
- "resolved" "https://registry.npmjs.org/react-icons/-/react-icons-4.3.1.tgz"
- "version" "4.3.1"
-
-"react-is@^16.13.1", "react-is@^16.7.0":
- "integrity" "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
- "resolved" "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz"
- "version" "16.13.1"
-
-"react-merge-refs@^1.1.0":
- "integrity" "sha512-alTKsjEL0dKH/ru1Iyn7vliS2QRcBp9zZPGoWxUOvRGWPUYgjo+V01is7p04It6KhgrzhJGnIj9GgX8W4bZoCQ=="
- "resolved" "https://registry.npmjs.org/react-merge-refs/-/react-merge-refs-1.1.0.tgz"
- "version" "1.1.0"
-
-"react-remove-scroll-bar@^2.1.0":
- "integrity" "sha512-UU9ZBP1wdMR8qoUs7owiVcpaPwsQxUDC2lypP6mmixaGlARZa7ZIBx1jcuObLdhMOvCsnZcvetOho0wzPa9PYg=="
- "resolved" "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.2.0.tgz"
- "version" "2.2.0"
- dependencies:
- "react-style-singleton" "^2.1.0"
- "tslib" "^1.0.0"
-
-"react-remove-scroll@2.4.1":
- "integrity" "sha512-K7XZySEzOHMTq7dDwcHsZA6Y7/1uX5RsWhRXVYv8rdh+y9Qz2nMwl9RX/Mwnj/j7JstCGmxyfyC0zbVGXYh3mA=="
- "resolved" "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.4.1.tgz"
- "version" "2.4.1"
- dependencies:
- "react-remove-scroll-bar" "^2.1.0"
- "react-style-singleton" "^2.1.0"
- "tslib" "^1.0.0"
- "use-callback-ref" "^1.2.3"
- "use-sidecar" "^1.0.1"
-
-"react-router-dom@^6.2.1":
- "integrity" "sha512-I6Zax+/TH/cZMDpj3/4Fl2eaNdcvoxxHoH1tYOREsQ22OKDYofGebrNm6CTPUcvLvZm63NL/vzCYdjf9CUhqmA=="
- "resolved" "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.2.1.tgz"
- "version" "6.2.1"
- dependencies:
- "history" "^5.2.0"
- "react-router" "6.2.1"
-
-"react-router@6.2.1":
- "integrity" "sha512-2fG0udBtxou9lXtK97eJeET2ki5//UWfQSl1rlJ7quwe6jrktK9FCCc8dQb5QY6jAv3jua8bBQRhhDOM/kVRsg=="
- "resolved" "https://registry.npmjs.org/react-router/-/react-router-6.2.1.tgz"
- "version" "6.2.1"
- dependencies:
- "history" "^5.2.0"
-
-"react-style-singleton@^2.1.0":
- "integrity" "sha512-jNRp07Jza6CBqdRKNgGhT3u9umWvils1xsuMOjZlghBDH2MU0PL2WZor4PGYjXpnRCa9DQSlHMs/xnABWOwYbA=="
- "resolved" "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.1.1.tgz"
- "version" "2.1.1"
- dependencies:
- "get-nonce" "^1.0.0"
- "invariant" "^2.2.4"
- "tslib" "^1.0.0"
-
-"react-use-measure@^2.1.1":
- "integrity" "sha512-nocZhN26cproIiIduswYpV5y5lQpSQS1y/4KuvUCjSKmw7ZWIS/+g3aFnX3WdBkyuGUtTLif3UTqnLLhbDoQig=="
- "resolved" "https://registry.npmjs.org/react-use-measure/-/react-use-measure-2.1.1.tgz"
- "version" "2.1.1"
- dependencies:
- "debounce" "^1.2.1"
-
-"react@*", "react@^15.3.0 || ^16.0.0 || ^17.0.0", "react@^16.8.0 || ^17.0.0", "react@^16.8.0 || 17.x", "react@^17.0.2", "react@>= 16.8", "react@>= 16.8.0", "react@>=0.14.0", "react@>=16.13", "react@>=16.8", "react@>=16.8 || ^17.0.0", "react@>=16.8.0", "react@>=16.8.6", "react@0.13.x || 0.14.x || ^15.0.0-0 || 15.x.x || ^16.0.0-0 || ^16.x.x || ^17.x.x || ^18.x.x", "react@15.x || 16.x || 17.x", "react@17.0.2":
- "integrity" "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA=="
- "resolved" "https://registry.npmjs.org/react/-/react-17.0.2.tgz"
- "version" "17.0.2"
- dependencies:
- "loose-envify" "^1.1.0"
- "object-assign" "^4.1.1"
-
-"regenerator-runtime@^0.13.4":
- "integrity" "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA=="
- "resolved" "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz"
- "version" "0.13.9"
-
-"resolve-from@^4.0.0":
- "integrity" "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="
- "resolved" "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz"
- "version" "4.0.0"
-
-"resolve@^1.12.0":
- "integrity" "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A=="
- "resolved" "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz"
- "version" "1.20.0"
- dependencies:
- "is-core-module" "^2.2.0"
- "path-parse" "^1.0.6"
-
-"safe-buffer@~5.1.1":
- "integrity" "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
- "resolved" "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz"
- "version" "5.1.2"
-
-"scheduler@^0.20.2":
- "integrity" "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ=="
- "resolved" "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz"
- "version" "0.20.2"
- dependencies:
- "loose-envify" "^1.1.0"
- "object-assign" "^4.1.1"
-
-"semver@^6.3.1":
- "integrity" "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="
- "resolved" "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz"
- "version" "6.3.1"
-
-"setimmediate@^1.0.5":
- "integrity" "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA=="
- "resolved" "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz"
- "version" "1.0.5"
-
-"source-map@^0.5.7":
- "integrity" "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
- "resolved" "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz"
- "version" "0.5.7"
-
-"style-value-types@5.0.0":
- "integrity" "sha512-08yq36Ikn4kx4YU6RD7jWEv27v4V+PUsOGa4n/as8Et3CuODMJQ00ENeAVXAeydX4Z2j1XHZF1K2sX4mGl18fA=="
- "resolved" "https://registry.npmjs.org/style-value-types/-/style-value-types-5.0.0.tgz"
- "version" "5.0.0"
- dependencies:
- "hey-listen" "^1.0.8"
- "tslib" "^2.1.0"
-
-"stylis@4.0.13":
- "integrity" "sha512-xGPXiFVl4YED9Jh7Euv2V220mriG9u4B2TA6Ybjc1catrstKD2PpIdU3U0RKpkVBC2EhmL/F0sPCr9vrFTNRag=="
- "resolved" "https://registry.npmjs.org/stylis/-/stylis-4.0.13.tgz"
- "version" "4.0.13"
-
-"supports-color@^5.3.0":
- "integrity" "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="
- "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz"
- "version" "5.5.0"
- dependencies:
- "has-flag" "^3.0.0"
-
-"tiny-invariant@^1.0.6":
- "integrity" "sha512-1Uhn/aqw5C6RI4KejVeTg6mIS7IqxnLJ8Mv2tV5rTc0qWobay7pDUz6Wi392Cnc8ak1H0F2cjoRzb2/AW4+Fvg=="
- "resolved" "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.2.0.tgz"
- "version" "1.2.0"
-
-"to-fast-properties@^2.0.0":
- "integrity" "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4="
- "resolved" "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz"
- "version" "2.0.0"
-
-"toggle-selection@^1.0.6":
- "integrity" "sha1-bkWxJj8gF/oKzH2J14sVuL932jI="
- "resolved" "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz"
- "version" "1.0.6"
-
-"tr46@~0.0.3":
- "integrity" "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
- "resolved" "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz"
- "version" "0.0.3"
-
-"tslib@^1.0.0":
- "integrity" "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
- "resolved" "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz"
- "version" "1.14.1"
-
-"tslib@^1.9.3":
- "integrity" "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
- "resolved" "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz"
- "version" "1.14.1"
-
-"tslib@^2.0.3", "tslib@^2.1.0":
- "integrity" "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw=="
- "resolved" "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz"
- "version" "2.3.1"
-
-"typescript@^4.5.4":
- "integrity" "sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg=="
- "resolved" "https://registry.npmjs.org/typescript/-/typescript-4.5.4.tgz"
- "version" "4.5.4"
-
-"ua-parser-js@^0.7.18":
- "integrity" "sha512-xV8kqRKM+jhMvcHWUKthV9fNebIzrNy//2O9ZwWcfiBFR5f25XVZPLlEajk/sf3Ra15V92isyQqnIEXRDaZWEA=="
- "resolved" "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.37.tgz"
- "version" "0.7.37"
-
-"uc.micro@^1.0.1":
- "integrity" "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA=="
- "resolved" "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz"
- "version" "1.0.6"
-
-"update-browserslist-db@^1.0.13":
- "integrity" "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg=="
- "resolved" "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz"
- "version" "1.0.13"
- dependencies:
- "escalade" "^3.1.1"
- "picocolors" "^1.0.0"
-
-"urql@^2.0.6":
- "integrity" "sha512-ovK9mx7YxD/CKUwVZGbEDBzZjbCcNsr1990nIhDCKe3Ij/0gNcIa+0EIyXKceOPuYDYKavIoaNQV2kOZjQxFcw=="
- "resolved" "https://registry.npmjs.org/urql/-/urql-2.0.6.tgz"
- "version" "2.0.6"
+ focus-lock "^0.9.1"
+ prop-types "^15.6.2"
+ react-clientside-effect "^1.2.5"
+ use-callback-ref "^1.2.5"
+ use-sidecar "^1.0.5"
+
+react-icons@^4.3.1:
+ version "4.3.1"
+ resolved "https://registry.npmjs.org/react-icons/-/react-icons-4.3.1.tgz"
+ integrity sha512-cB10MXLTs3gVuXimblAdI71jrJx8njrJZmNMEMC+sQu5B/BIOmlsAjskdqpn81y8UBVEGuHODd7/ci5DvoSzTQ==
+
+react-is@^16.13.1, react-is@^16.7.0:
+ version "16.13.1"
+ resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz"
+ integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
+
+react-merge-refs@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/react-merge-refs/-/react-merge-refs-1.1.0.tgz"
+ integrity sha512-alTKsjEL0dKH/ru1Iyn7vliS2QRcBp9zZPGoWxUOvRGWPUYgjo+V01is7p04It6KhgrzhJGnIj9GgX8W4bZoCQ==
+
+react-remove-scroll-bar@^2.1.0:
+ version "2.2.0"
+ resolved "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.2.0.tgz"
+ integrity sha512-UU9ZBP1wdMR8qoUs7owiVcpaPwsQxUDC2lypP6mmixaGlARZa7ZIBx1jcuObLdhMOvCsnZcvetOho0wzPa9PYg==
+ dependencies:
+ react-style-singleton "^2.1.0"
+ tslib "^1.0.0"
+
+react-remove-scroll@2.4.1:
+ version "2.4.1"
+ resolved "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.4.1.tgz"
+ integrity sha512-K7XZySEzOHMTq7dDwcHsZA6Y7/1uX5RsWhRXVYv8rdh+y9Qz2nMwl9RX/Mwnj/j7JstCGmxyfyC0zbVGXYh3mA==
+ dependencies:
+ react-remove-scroll-bar "^2.1.0"
+ react-style-singleton "^2.1.0"
+ tslib "^1.0.0"
+ use-callback-ref "^1.2.3"
+ use-sidecar "^1.0.1"
+
+react-router-dom@^6.2.1:
+ version "6.2.1"
+ resolved "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.2.1.tgz"
+ integrity sha512-I6Zax+/TH/cZMDpj3/4Fl2eaNdcvoxxHoH1tYOREsQ22OKDYofGebrNm6CTPUcvLvZm63NL/vzCYdjf9CUhqmA==
+ dependencies:
+ history "^5.2.0"
+ react-router "6.2.1"
+
+react-router@6.2.1:
+ version "6.2.1"
+ resolved "https://registry.npmjs.org/react-router/-/react-router-6.2.1.tgz"
+ integrity sha512-2fG0udBtxou9lXtK97eJeET2ki5//UWfQSl1rlJ7quwe6jrktK9FCCc8dQb5QY6jAv3jua8bBQRhhDOM/kVRsg==
+ dependencies:
+ history "^5.2.0"
+
+react-style-singleton@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.1.1.tgz"
+ integrity sha512-jNRp07Jza6CBqdRKNgGhT3u9umWvils1xsuMOjZlghBDH2MU0PL2WZor4PGYjXpnRCa9DQSlHMs/xnABWOwYbA==
+ dependencies:
+ get-nonce "^1.0.0"
+ invariant "^2.2.4"
+ tslib "^1.0.0"
+
+react-use-measure@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.npmjs.org/react-use-measure/-/react-use-measure-2.1.1.tgz"
+ integrity sha512-nocZhN26cproIiIduswYpV5y5lQpSQS1y/4KuvUCjSKmw7ZWIS/+g3aFnX3WdBkyuGUtTLif3UTqnLLhbDoQig==
+ dependencies:
+ debounce "^1.2.1"
+
+react@*, "react@^15.3.0 || ^16.0.0 || ^17.0.0", "react@^16.8.0 || ^17.0.0", "react@^16.8.0 || 17.x", react@^17.0.2, "react@>= 16.8", "react@>= 16.8.0", react@>=0.14.0, react@>=16.13, react@>=16.8, "react@>=16.8 || ^17.0.0", react@>=16.8.0, react@>=16.8.6, "react@0.13.x || 0.14.x || ^15.0.0-0 || 15.x.x || ^16.0.0-0 || ^16.x.x || ^17.x.x || ^18.x.x", "react@15.x || 16.x || 17.x", react@17.0.2:
+ version "17.0.2"
+ resolved "https://registry.npmjs.org/react/-/react-17.0.2.tgz"
+ integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==
+ dependencies:
+ loose-envify "^1.1.0"
+ object-assign "^4.1.1"
+
+regenerator-runtime@^0.13.4:
+ version "0.13.9"
+ resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz"
+ integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==
+
+resolve-from@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz"
+ integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
+
+resolve@^1.12.0:
+ version "1.20.0"
+ resolved "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz"
+ integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==
+ dependencies:
+ is-core-module "^2.2.0"
+ path-parse "^1.0.6"
+
+safe-buffer@~5.1.1:
+ version "5.1.2"
+ resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz"
+ integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
+
+scheduler@^0.20.2:
+ version "0.20.2"
+ resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz"
+ integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==
+ dependencies:
+ loose-envify "^1.1.0"
+ object-assign "^4.1.1"
+
+semver@^6.3.1:
+ version "6.3.1"
+ resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz"
+ integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
+
+setimmediate@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz"
+ integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==
+
+source-map@^0.5.7:
+ version "0.5.7"
+ resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz"
+ integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
+
+style-value-types@5.0.0:
+ version "5.0.0"
+ resolved "https://registry.npmjs.org/style-value-types/-/style-value-types-5.0.0.tgz"
+ integrity sha512-08yq36Ikn4kx4YU6RD7jWEv27v4V+PUsOGa4n/as8Et3CuODMJQ00ENeAVXAeydX4Z2j1XHZF1K2sX4mGl18fA==
+ dependencies:
+ hey-listen "^1.0.8"
+ tslib "^2.1.0"
+
+stylis@4.0.13:
+ version "4.0.13"
+ resolved "https://registry.npmjs.org/stylis/-/stylis-4.0.13.tgz"
+ integrity sha512-xGPXiFVl4YED9Jh7Euv2V220mriG9u4B2TA6Ybjc1catrstKD2PpIdU3U0RKpkVBC2EhmL/F0sPCr9vrFTNRag==
+
+supports-color@^5.3.0:
+ version "5.5.0"
+ resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz"
+ integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
+ dependencies:
+ has-flag "^3.0.0"
+
+tiny-invariant@^1.0.6:
+ version "1.2.0"
+ resolved "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.2.0.tgz"
+ integrity sha512-1Uhn/aqw5C6RI4KejVeTg6mIS7IqxnLJ8Mv2tV5rTc0qWobay7pDUz6Wi392Cnc8ak1H0F2cjoRzb2/AW4+Fvg==
+
+to-fast-properties@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz"
+ integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=
+
+toggle-selection@^1.0.6:
+ version "1.0.6"
+ resolved "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz"
+ integrity sha1-bkWxJj8gF/oKzH2J14sVuL932jI=
+
+tr46@~0.0.3:
+ version "0.0.3"
+ resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz"
+ integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==
+
+tslib@^1.0.0:
+ version "1.14.1"
+ resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz"
+ integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
+
+tslib@^1.9.3:
+ version "1.14.1"
+ resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz"
+ integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
+
+tslib@^2.0.3, tslib@^2.1.0:
+ version "2.3.1"
+ resolved "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz"
+ integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==
+
+typescript@^4.5.4:
+ version "4.5.4"
+ resolved "https://registry.npmjs.org/typescript/-/typescript-4.5.4.tgz"
+ integrity sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==
+
+ua-parser-js@^0.7.18:
+ version "0.7.37"
+ resolved "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.37.tgz"
+ integrity sha512-xV8kqRKM+jhMvcHWUKthV9fNebIzrNy//2O9ZwWcfiBFR5f25XVZPLlEajk/sf3Ra15V92isyQqnIEXRDaZWEA==
+
+uc.micro@^1.0.1:
+ version "1.0.6"
+ resolved "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz"
+ integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==
+
+update-browserslist-db@^1.0.13:
+ version "1.0.13"
+ resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz"
+ integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==
+ dependencies:
+ escalade "^3.1.1"
+ picocolors "^1.0.0"
+
+urql@^2.0.6:
+ version "2.0.6"
+ resolved "https://registry.npmjs.org/urql/-/urql-2.0.6.tgz"
+ integrity sha512-ovK9mx7YxD/CKUwVZGbEDBzZjbCcNsr1990nIhDCKe3Ij/0gNcIa+0EIyXKceOPuYDYKavIoaNQV2kOZjQxFcw==
dependencies:
"@urql/core" "^2.3.6"
- "wonka" "^4.0.14"
-
-"use-callback-ref@^1.2.3", "use-callback-ref@^1.2.5":
- "integrity" "sha512-gN3vgMISAgacF7sqsLPByqoePooY3n2emTH59Ur5d/M8eg4WTWu1xp8i8DHjohftIyEx0S08RiYxbffr4j8Peg=="
- "resolved" "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.2.5.tgz"
- "version" "1.2.5"
-
-"use-sidecar@^1.0.1", "use-sidecar@^1.0.5":
- "integrity" "sha512-k9jnrjYNwN6xYLj1iaGhonDghfvmeTmYjAiGvOr7clwKfPjMXJf4/HOr7oT5tJwYafgp2tG2l3eZEOfoELiMcA=="
- "resolved" "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.0.5.tgz"
- "version" "1.0.5"
- dependencies:
- "detect-node-es" "^1.1.0"
- "tslib" "^1.9.3"
-
-"warning@^4.0.3":
- "integrity" "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w=="
- "resolved" "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz"
- "version" "4.0.3"
- dependencies:
- "loose-envify" "^1.0.0"
-
-"webidl-conversions@^3.0.0":
- "integrity" "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
- "resolved" "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz"
- "version" "3.0.1"
-
-"whatwg-url@^5.0.0":
- "integrity" "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="
- "resolved" "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz"
- "version" "5.0.0"
- dependencies:
- "tr46" "~0.0.3"
- "webidl-conversions" "^3.0.0"
-
-"wonka@^4.0.14":
- "integrity" "sha512-U0IUQHKXXn6PFo9nqsHphVCE5m3IntqZNB9Jjn7EB1lrR7YTDY3YWgFvEvwniTzXSvOH/XMzAZaIfJF/LvHYXg=="
- "resolved" "https://registry.npmjs.org/wonka/-/wonka-4.0.15.tgz"
- "version" "4.0.15"
-
-"yallist@^3.0.2":
- "integrity" "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
- "resolved" "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz"
- "version" "3.1.1"
-
-"yaml@^1.7.2":
- "integrity" "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg=="
- "resolved" "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz"
- "version" "1.10.2"
+ wonka "^4.0.14"
+
+use-callback-ref@^1.2.3, use-callback-ref@^1.2.5:
+ version "1.2.5"
+ resolved "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.2.5.tgz"
+ integrity sha512-gN3vgMISAgacF7sqsLPByqoePooY3n2emTH59Ur5d/M8eg4WTWu1xp8i8DHjohftIyEx0S08RiYxbffr4j8Peg==
+
+use-sidecar@^1.0.1, use-sidecar@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.0.5.tgz"
+ integrity sha512-k9jnrjYNwN6xYLj1iaGhonDghfvmeTmYjAiGvOr7clwKfPjMXJf4/HOr7oT5tJwYafgp2tG2l3eZEOfoELiMcA==
+ dependencies:
+ detect-node-es "^1.1.0"
+ tslib "^1.9.3"
+
+warning@^4.0.3:
+ version "4.0.3"
+ resolved "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz"
+ integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==
+ dependencies:
+ loose-envify "^1.0.0"
+
+webidl-conversions@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz"
+ integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==
+
+whatwg-url@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz"
+ integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==
+ dependencies:
+ tr46 "~0.0.3"
+ webidl-conversions "^3.0.0"
+
+wonka@^4.0.14:
+ version "4.0.15"
+ resolved "https://registry.npmjs.org/wonka/-/wonka-4.0.15.tgz"
+ integrity sha512-U0IUQHKXXn6PFo9nqsHphVCE5m3IntqZNB9Jjn7EB1lrR7YTDY3YWgFvEvwniTzXSvOH/XMzAZaIfJF/LvHYXg==
+
+yallist@^3.0.2:
+ version "3.1.1"
+ resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz"
+ integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
+
+yaml@^1.7.2:
+ version "1.10.2"
+ resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz"
+ integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==
diff --git a/server/db/models/otp.go b/server/db/models/otp.go
index bd0b41cc8..ad84cf26e 100644
--- a/server/db/models/otp.go
+++ b/server/db/models/otp.go
@@ -11,8 +11,8 @@ const (
type OTP struct {
Key string `json:"_key,omitempty" bson:"_key,omitempty" cql:"_key,omitempty" dynamo:"key,omitempty"` // for arangodb
ID string `gorm:"primaryKey;type:char(36)" json:"_id" bson:"_id" cql:"id" dynamo:"id,hash"`
- Email string `gorm:"unique" json:"email" bson:"email" cql:"email" dynamo:"email" index:"email,hash"`
- PhoneNumber string `gorm:"index:unique_index_phone_number,unique" json:"phone_number" bson:"phone_number" cql:"phone_number" dynamo:"phone_number"`
+ Email string `gorm:"index" json:"email" bson:"email" cql:"email" dynamo:"email" index:"email,hash"`
+ PhoneNumber string `gorm:"index" json:"phone_number" bson:"phone_number" cql:"phone_number" dynamo:"phone_number"`
Otp string `json:"otp" bson:"otp" cql:"otp" dynamo:"otp"`
ExpiresAt int64 `json:"expires_at" bson:"expires_at" cql:"expires_at" dynamo:"expires_at"`
CreatedAt int64 `json:"created_at" bson:"created_at" cql:"created_at" dynamo:"created_at"`
diff --git a/server/db/models/user.go b/server/db/models/user.go
index d89b36fb9..3e4f354e8 100644
--- a/server/db/models/user.go
+++ b/server/db/models/user.go
@@ -15,7 +15,7 @@ type User struct {
Key string `json:"_key,omitempty" bson:"_key,omitempty" cql:"_key,omitempty" dynamo:"key,omitempty"` // for arangodb
ID string `gorm:"primaryKey;type:char(36)" json:"_id" bson:"_id" cql:"id" dynamo:"id,hash"`
- Email *string `gorm:"unique" json:"email" bson:"email" cql:"email" dynamo:"email" index:"email,hash"`
+ Email *string `gorm:"index" json:"email" bson:"email" cql:"email" dynamo:"email" index:"email,hash"`
EmailVerifiedAt *int64 `json:"email_verified_at" bson:"email_verified_at" cql:"email_verified_at" dynamo:"email_verified_at"`
Password *string `json:"password" bson:"password" cql:"password" dynamo:"password"`
SignupMethods string `json:"signup_methods" bson:"signup_methods" cql:"signup_methods" dynamo:"signup_methods"`
diff --git a/server/db/providers/arangodb/authenticator.go b/server/db/providers/arangodb/authenticator.go
index 205ba675c..c701ebc73 100644
--- a/server/db/providers/arangodb/authenticator.go
+++ b/server/db/providers/arangodb/authenticator.go
@@ -28,7 +28,7 @@ func (p *provider) AddAuthenticator(ctx context.Context, authenticators *models.
authenticatorsCollection, _ := p.db.Collection(ctx, models.Collections.Authenticators)
meta, err := authenticatorsCollection.CreateDocument(arangoDriver.WithOverwrite(ctx), authenticators)
if err != nil {
- return authenticators, err
+ return nil, err
}
authenticators.Key = meta.Key
authenticators.ID = meta.ID.String()
@@ -42,7 +42,7 @@ func (p *provider) UpdateAuthenticator(ctx context.Context, authenticators *mode
collection, _ := p.db.Collection(ctx, models.Collections.Authenticators)
meta, err := collection.UpdateDocument(ctx, authenticators.Key, authenticators)
if err != nil {
- return authenticators, err
+ return nil, err
}
authenticators.Key = meta.Key
@@ -59,7 +59,7 @@ func (p *provider) GetAuthenticatorDetailsByUserId(ctx context.Context, userId s
}
cursor, err := p.db.Query(ctx, query, bindVars)
if err != nil {
- return authenticators, err
+ return nil, err
}
defer cursor.Close()
for {
@@ -71,7 +71,7 @@ func (p *provider) GetAuthenticatorDetailsByUserId(ctx context.Context, userId s
}
_, err := cursor.ReadDocument(ctx, &authenticators)
if err != nil {
- return authenticators, err
+ return nil, err
}
}
return authenticators, nil
diff --git a/server/db/providers/arangodb/env.go b/server/db/providers/arangodb/env.go
index bb4610a00..27f7c25f5 100644
--- a/server/db/providers/arangodb/env.go
+++ b/server/db/providers/arangodb/env.go
@@ -23,7 +23,7 @@ func (p *provider) AddEnv(ctx context.Context, env *models.Env) (*models.Env, er
configCollection, _ := p.db.Collection(ctx, models.Collections.Env)
meta, err := configCollection.CreateDocument(arangoDriver.WithOverwrite(ctx), env)
if err != nil {
- return env, err
+ return nil, err
}
env.Key = meta.Key
env.ID = meta.ID.String()
@@ -36,7 +36,7 @@ func (p *provider) UpdateEnv(ctx context.Context, env *models.Env) (*models.Env,
collection, _ := p.db.Collection(ctx, models.Collections.Env)
meta, err := collection.UpdateDocument(ctx, env.Key, env)
if err != nil {
- return env, err
+ return nil, err
}
env.Key = meta.Key
@@ -50,7 +50,7 @@ func (p *provider) GetEnv(ctx context.Context) (*models.Env, error) {
query := fmt.Sprintf("FOR d in %s RETURN d", models.Collections.Env)
cursor, err := p.db.Query(ctx, query, nil)
if err != nil {
- return env, err
+ return nil, err
}
defer cursor.Close()
for {
@@ -62,7 +62,7 @@ func (p *provider) GetEnv(ctx context.Context) (*models.Env, error) {
}
_, err := cursor.ReadDocument(ctx, &env)
if err != nil {
- return env, err
+ return nil, err
}
}
diff --git a/server/db/providers/arangodb/user.go b/server/db/providers/arangodb/user.go
index 926cdb997..5caca74a2 100644
--- a/server/db/providers/arangodb/user.go
+++ b/server/db/providers/arangodb/user.go
@@ -27,7 +27,7 @@ func (p *provider) AddUser(ctx context.Context, user *models.User) (*models.User
if user.Roles == "" {
defaultRoles, err := memorystore.Provider.GetStringStoreEnvVariable(constants.EnvKeyDefaultRoles)
if err != nil {
- return user, err
+ return nil, err
}
user.Roles = defaultRoles
}
@@ -36,6 +36,10 @@ func (p *provider) AddUser(ctx context.Context, user *models.User) (*models.User
if u, _ := p.GetUserByPhoneNumber(ctx, refs.StringValue(user.PhoneNumber)); u != nil && u.ID != user.ID {
return user, fmt.Errorf("user with given phone number already exists")
}
+ } else if user.Email != nil && strings.TrimSpace(refs.StringValue(user.Email)) != "" {
+ if u, _ := p.GetUserByEmail(ctx, refs.StringValue(user.Email)); u != nil && u.ID != user.ID {
+ return user, fmt.Errorf("user with given email already exists")
+ }
}
user.CreatedAt = time.Now().Unix()
@@ -43,7 +47,7 @@ func (p *provider) AddUser(ctx context.Context, user *models.User) (*models.User
userCollection, _ := p.db.Collection(ctx, models.Collections.User)
meta, err := userCollection.CreateDocument(arangoDriver.WithOverwrite(ctx), user)
if err != nil {
- return user, err
+ return nil, err
}
user.Key = meta.Key
user.ID = meta.ID.String()
@@ -58,7 +62,7 @@ func (p *provider) UpdateUser(ctx context.Context, user *models.User) (*models.U
collection, _ := p.db.Collection(ctx, models.Collections.User)
meta, err := collection.UpdateDocument(ctx, user.Key, user)
if err != nil {
- return user, err
+ return nil, err
}
user.Key = meta.Key
@@ -125,19 +129,19 @@ func (p *provider) GetUserByEmail(ctx context.Context, email string) (*models.Us
}
cursor, err := p.db.Query(ctx, query, bindVars)
if err != nil {
- return user, err
+ return nil, err
}
defer cursor.Close()
for {
if !cursor.HasMore() {
if user == nil {
- return user, fmt.Errorf("user not found")
+ return nil, fmt.Errorf("user not found")
}
break
}
_, err := cursor.ReadDocument(ctx, &user)
if err != nil {
- return user, err
+ return nil, err
}
}
return user, nil
@@ -152,19 +156,19 @@ func (p *provider) GetUserByID(ctx context.Context, id string) (*models.User, er
}
cursor, err := p.db.Query(ctx, query, bindVars)
if err != nil {
- return user, err
+ return nil, err
}
defer cursor.Close()
for {
if !cursor.HasMore() {
if user == nil {
- return user, fmt.Errorf("user not found")
+ return nil, fmt.Errorf("user not found")
}
break
}
_, err := cursor.ReadDocument(ctx, &user)
if err != nil {
- return user, err
+ return nil, err
}
}
return user, nil
diff --git a/server/db/providers/arangodb/verification_requests.go b/server/db/providers/arangodb/verification_requests.go
index 05a8186b0..2b12a994d 100644
--- a/server/db/providers/arangodb/verification_requests.go
+++ b/server/db/providers/arangodb/verification_requests.go
@@ -22,7 +22,7 @@ func (p *provider) AddVerificationRequest(ctx context.Context, verificationReque
verificationRequestRequestCollection, _ := p.db.Collection(ctx, models.Collections.VerificationRequest)
meta, err := verificationRequestRequestCollection.CreateDocument(ctx, verificationRequest)
if err != nil {
- return verificationRequest, err
+ return nil, err
}
verificationRequest.Key = meta.Key
verificationRequest.ID = meta.ID.String()
@@ -38,7 +38,7 @@ func (p *provider) GetVerificationRequestByToken(ctx context.Context, token stri
}
cursor, err := p.db.Query(ctx, query, bindVars)
if err != nil {
- return verificationRequest, err
+ return nil, err
}
defer cursor.Close()
for {
@@ -50,7 +50,7 @@ func (p *provider) GetVerificationRequestByToken(ctx context.Context, token stri
}
_, err := cursor.ReadDocument(ctx, &verificationRequest)
if err != nil {
- return verificationRequest, err
+ return nil, err
}
}
return verificationRequest, nil
@@ -66,7 +66,7 @@ func (p *provider) GetVerificationRequestByEmail(ctx context.Context, email stri
}
cursor, err := p.db.Query(ctx, query, bindVars)
if err != nil {
- return verificationRequest, err
+ return nil, err
}
defer cursor.Close()
for {
@@ -78,7 +78,7 @@ func (p *provider) GetVerificationRequestByEmail(ctx context.Context, email stri
}
_, err := cursor.ReadDocument(ctx, &verificationRequest)
if err != nil {
- return verificationRequest, err
+ return nil, err
}
}
return verificationRequest, nil
diff --git a/server/db/providers/cassandradb/authenticator.go b/server/db/providers/cassandradb/authenticator.go
index e012ba30a..369a75aa6 100644
--- a/server/db/providers/cassandradb/authenticator.go
+++ b/server/db/providers/cassandradb/authenticator.go
@@ -29,7 +29,7 @@ func (p *provider) AddAuthenticator(ctx context.Context, authenticators *models.
bytes, err := json.Marshal(authenticators)
if err != nil {
- return authenticators, err
+ return nil, err
}
// use decoder instead of json.Unmarshall, because it converts int64 -> float64 after unmarshalling
@@ -38,7 +38,7 @@ func (p *provider) AddAuthenticator(ctx context.Context, authenticators *models.
authenticatorsMap := map[string]interface{}{}
err = decoder.Decode(&authenticatorsMap)
if err != nil {
- return authenticators, err
+ return nil, err
}
fields := "("
@@ -66,7 +66,7 @@ func (p *provider) AddAuthenticator(ctx context.Context, authenticators *models.
query := fmt.Sprintf("INSERT INTO %s %s VALUES %s IF NOT EXISTS", KeySpace+"."+models.Collections.Authenticators, fields, values)
err = p.db.Query(query).Exec()
if err != nil {
- return authenticators, err
+ return nil, err
}
return authenticators, nil
@@ -77,7 +77,7 @@ func (p *provider) UpdateAuthenticator(ctx context.Context, authenticators *mode
bytes, err := json.Marshal(authenticators)
if err != nil {
- return authenticators, err
+ return nil, err
}
// use decoder instead of json.Unmarshall, because it converts int64 -> float64 after unmarshalling
decoder := json.NewDecoder(strings.NewReader(string(bytes)))
@@ -85,7 +85,7 @@ func (p *provider) UpdateAuthenticator(ctx context.Context, authenticators *mode
authenticatorsMap := map[string]interface{}{}
err = decoder.Decode(&authenticatorsMap)
if err != nil {
- return authenticators, err
+ return nil, err
}
updateFields := ""
@@ -116,7 +116,7 @@ func (p *provider) UpdateAuthenticator(ctx context.Context, authenticators *mode
query := fmt.Sprintf("UPDATE %s SET %s WHERE id = '%s'", KeySpace+"."+models.Collections.Authenticators, updateFields, authenticators.ID)
err = p.db.Query(query).Exec()
if err != nil {
- return authenticators, err
+ return nil, err
}
return authenticators, nil
diff --git a/server/db/providers/cassandradb/env.go b/server/db/providers/cassandradb/env.go
index 636f9f4ef..627403dcc 100644
--- a/server/db/providers/cassandradb/env.go
+++ b/server/db/providers/cassandradb/env.go
@@ -20,7 +20,7 @@ func (p *provider) AddEnv(ctx context.Context, env *models.Env) (*models.Env, er
insertEnvQuery := fmt.Sprintf("INSERT INTO %s (id, env, hash, created_at, updated_at) VALUES ('%s', '%s', '%s', %d, %d)", KeySpace+"."+models.Collections.Env, env.ID, env.EnvData, env.Hash, env.CreatedAt, env.UpdatedAt)
err := p.db.Query(insertEnvQuery).Exec()
if err != nil {
- return env, err
+ return nil, err
}
return env, nil
@@ -32,7 +32,7 @@ func (p *provider) UpdateEnv(ctx context.Context, env *models.Env) (*models.Env,
updateEnvQuery := fmt.Sprintf("UPDATE %s SET env = '%s', updated_at = %d WHERE id = '%s'", KeySpace+"."+models.Collections.Env, env.EnvData, env.UpdatedAt, env.ID)
err := p.db.Query(updateEnvQuery).Exec()
if err != nil {
- return env, err
+ return nil, err
}
return env, nil
}
diff --git a/server/db/providers/cassandradb/user.go b/server/db/providers/cassandradb/user.go
index a10bfdf28..7fb252981 100644
--- a/server/db/providers/cassandradb/user.go
+++ b/server/db/providers/cassandradb/user.go
@@ -26,7 +26,7 @@ func (p *provider) AddUser(ctx context.Context, user *models.User) (*models.User
if user.Roles == "" {
defaultRoles, err := memorystore.Provider.GetStringStoreEnvVariable(constants.EnvKeyDefaultRoles)
if err != nil {
- return user, err
+ return nil, err
}
user.Roles = defaultRoles
}
@@ -35,6 +35,10 @@ func (p *provider) AddUser(ctx context.Context, user *models.User) (*models.User
if u, _ := p.GetUserByPhoneNumber(ctx, refs.StringValue(user.PhoneNumber)); u != nil && u.ID != user.ID {
return user, fmt.Errorf("user with given phone number already exists")
}
+ } else if user.Email != nil && strings.TrimSpace(refs.StringValue(user.Email)) != "" {
+ if u, _ := p.GetUserByEmail(ctx, refs.StringValue(user.Email)); u != nil && u.ID != user.ID {
+ return user, fmt.Errorf("user with given email already exists")
+ }
}
user.CreatedAt = time.Now().Unix()
@@ -42,7 +46,7 @@ func (p *provider) AddUser(ctx context.Context, user *models.User) (*models.User
bytes, err := json.Marshal(user)
if err != nil {
- return user, err
+ return nil, err
}
// use decoder instead of json.Unmarshall, because it converts int64 -> float64 after unmarshalling
@@ -51,7 +55,7 @@ func (p *provider) AddUser(ctx context.Context, user *models.User) (*models.User
userMap := map[string]interface{}{}
err = decoder.Decode(&userMap)
if err != nil {
- return user, err
+ return nil, err
}
fields := "("
@@ -80,7 +84,7 @@ func (p *provider) AddUser(ctx context.Context, user *models.User) (*models.User
err = p.db.Query(query).Exec()
if err != nil {
- return user, err
+ return nil, err
}
return user, nil
@@ -92,7 +96,7 @@ func (p *provider) UpdateUser(ctx context.Context, user *models.User) (*models.U
bytes, err := json.Marshal(user)
if err != nil {
- return user, err
+ return nil, err
}
// use decoder instead of json.Unmarshall, because it converts int64 -> float64 after unmarshalling
decoder := json.NewDecoder(strings.NewReader(string(bytes)))
@@ -100,7 +104,7 @@ func (p *provider) UpdateUser(ctx context.Context, user *models.User) (*models.U
userMap := map[string]interface{}{}
err = decoder.Decode(&userMap)
if err != nil {
- return user, err
+ return nil, err
}
updateFields := ""
@@ -131,7 +135,7 @@ func (p *provider) UpdateUser(ctx context.Context, user *models.User) (*models.U
query := fmt.Sprintf("UPDATE %s SET %s WHERE id = '%s'", KeySpace+"."+models.Collections.User, updateFields, user.ID)
err = p.db.Query(query).Exec()
if err != nil {
- return user, err
+ return nil, err
}
return user, nil
diff --git a/server/db/providers/cassandradb/verification_requests.go b/server/db/providers/cassandradb/verification_requests.go
index aa8e66d80..e741c5dd8 100644
--- a/server/db/providers/cassandradb/verification_requests.go
+++ b/server/db/providers/cassandradb/verification_requests.go
@@ -23,7 +23,7 @@ func (p *provider) AddVerificationRequest(ctx context.Context, verificationReque
query := fmt.Sprintf("INSERT INTO %s (id, jwt_token, identifier, expires_at, email, nonce, redirect_uri, created_at, updated_at) VALUES ('%s', '%s', '%s', %d, '%s', '%s', '%s', %d, %d)", KeySpace+"."+models.Collections.VerificationRequest, verificationRequest.ID, verificationRequest.Token, verificationRequest.Identifier, verificationRequest.ExpiresAt, verificationRequest.Email, verificationRequest.Nonce, verificationRequest.RedirectURI, verificationRequest.CreatedAt, verificationRequest.UpdatedAt)
err := p.db.Query(query).Exec()
if err != nil {
- return verificationRequest, err
+ return nil, err
}
return verificationRequest, nil
}
diff --git a/server/db/providers/couchbase/authenticator.go b/server/db/providers/couchbase/authenticator.go
index e98126458..dc81cb9da 100644
--- a/server/db/providers/couchbase/authenticator.go
+++ b/server/db/providers/couchbase/authenticator.go
@@ -30,7 +30,7 @@ func (p *provider) AddAuthenticator(ctx context.Context, authenticators *models.
}
_, err := p.db.Collection(models.Collections.Authenticators).Insert(authenticators.ID, authenticators, &insertOpt)
if err != nil {
- return authenticators, err
+ return nil, err
}
return authenticators, nil
}
@@ -71,11 +71,11 @@ func (p *provider) GetAuthenticatorDetailsByUserId(ctx context.Context, userId s
PositionalParameters: []interface{}{userId, authenticatorType},
})
if err != nil {
- return authenticators, err
+ return nil, err
}
err = q.One(&authenticators)
if err != nil {
- return authenticators, err
+ return nil, err
}
return authenticators, nil
}
diff --git a/server/db/providers/couchbase/env.go b/server/db/providers/couchbase/env.go
index 3f2493714..7c08e7f4f 100644
--- a/server/db/providers/couchbase/env.go
+++ b/server/db/providers/couchbase/env.go
@@ -24,7 +24,7 @@ func (p *provider) AddEnv(ctx context.Context, env *models.Env) (*models.Env, er
}
_, err := p.db.Collection(models.Collections.Env).Insert(env.ID, env, &insertOpt)
if err != nil {
- return env, err
+ return nil, err
}
return env, nil
}
@@ -40,7 +40,7 @@ func (p *provider) UpdateEnv(ctx context.Context, env *models.Env) (*models.Env,
PositionalParameters: []interface{}{env.EnvData, env.UpdatedAt, env.UpdatedAt, env.ID},
})
if err != nil {
- return env, err
+ return nil, err
}
return env, nil
}
@@ -55,11 +55,11 @@ func (p *provider) GetEnv(ctx context.Context) (*models.Env, error) {
ScanConsistency: gocb.QueryScanConsistencyRequestPlus,
})
if err != nil {
- return env, err
+ return nil, err
}
err = q.One(&env)
if err != nil {
- return env, err
+ return nil, err
}
env.Hash = env.EncryptionKey
return env, nil
diff --git a/server/db/providers/couchbase/otp.go b/server/db/providers/couchbase/otp.go
index 1fe653242..2980b94e0 100644
--- a/server/db/providers/couchbase/otp.go
+++ b/server/db/providers/couchbase/otp.go
@@ -50,7 +50,7 @@ func (p *provider) UpsertOTP(ctx context.Context, otpParam *models.OTP) (*models
}
_, err := p.db.Collection(models.Collections.OTP).Insert(otp.ID, otp, &insertOpt)
if err != nil {
- return otp, err
+ return nil, err
}
} else {
query := fmt.Sprintf(`UPDATE %s.%s SET otp=$1, expires_at=$2, updated_at=$3 WHERE _id=$4`, p.scopeName, models.Collections.OTP)
@@ -58,7 +58,7 @@ func (p *provider) UpsertOTP(ctx context.Context, otpParam *models.OTP) (*models
PositionalParameters: []interface{}{otp.Otp, otp.ExpiresAt, otp.UpdatedAt, otp.ID},
})
if err != nil {
- return otp, err
+ return nil, err
}
}
return otp, nil
diff --git a/server/db/providers/couchbase/provider.go b/server/db/providers/couchbase/provider.go
index 723e47ab8..7eef85da0 100644
--- a/server/db/providers/couchbase/provider.go
+++ b/server/db/providers/couchbase/provider.go
@@ -127,7 +127,7 @@ func CreateBucketAndScope(cluster *gocb.Cluster, bucketName string, scopeName st
if scopeName != defaultScope {
err = bucket.Collections().CreateScope(scopeName, nil)
if err != nil && !errors.Is(err, gocb.ErrScopeExists) {
- return bucket, err
+ return nil, err
}
}
return bucket, nil
diff --git a/server/db/providers/couchbase/shared.go b/server/db/providers/couchbase/shared.go
index 00a8cfa6a..a97ac6d97 100644
--- a/server/db/providers/couchbase/shared.go
+++ b/server/db/providers/couchbase/shared.go
@@ -47,7 +47,7 @@ func (p *provider) GetTotalDocs(ctx context.Context, collection string) (int64,
})
queryRes.One(&totalDocs)
if err != nil {
- return totalDocs.Total, err
+ return 0, err
}
return totalDocs.Total, nil
}
diff --git a/server/db/providers/couchbase/user.go b/server/db/providers/couchbase/user.go
index 21ec17697..ec80b7d66 100644
--- a/server/db/providers/couchbase/user.go
+++ b/server/db/providers/couchbase/user.go
@@ -4,12 +4,14 @@ import (
"context"
"fmt"
"log"
+ "strings"
"time"
"github.com/authorizerdev/authorizer/server/constants"
"github.com/authorizerdev/authorizer/server/db/models"
"github.com/authorizerdev/authorizer/server/graph/model"
"github.com/authorizerdev/authorizer/server/memorystore"
+ "github.com/authorizerdev/authorizer/server/refs"
"github.com/couchbase/gocb/v2"
"github.com/google/uuid"
)
@@ -23,11 +25,21 @@ func (p *provider) AddUser(ctx context.Context, user *models.User) (*models.User
if user.Roles == "" {
defaultRoles, err := memorystore.Provider.GetStringStoreEnvVariable(constants.EnvKeyDefaultRoles)
if err != nil {
- return user, err
+ return nil, err
}
user.Roles = defaultRoles
}
+ if user.PhoneNumber != nil && strings.TrimSpace(refs.StringValue(user.PhoneNumber)) != "" {
+ if u, _ := p.GetUserByPhoneNumber(ctx, refs.StringValue(user.PhoneNumber)); u != nil && u.ID != user.ID {
+ return user, fmt.Errorf("user with given phone number already exists")
+ }
+ } else if user.Email != nil && strings.TrimSpace(refs.StringValue(user.Email)) != "" {
+ if u, _ := p.GetUserByEmail(ctx, refs.StringValue(user.Email)); u != nil && u.ID != user.ID {
+ return user, fmt.Errorf("user with given email already exists")
+ }
+ }
+
user.CreatedAt = time.Now().Unix()
user.UpdatedAt = time.Now().Unix()
insertOpt := gocb.InsertOptions{
@@ -35,7 +47,7 @@ func (p *provider) AddUser(ctx context.Context, user *models.User) (*models.User
}
_, err := p.db.Collection(models.Collections.User).Insert(user.ID, user, &insertOpt)
if err != nil {
- return user, err
+ return nil, err
}
return user, nil
}
@@ -48,7 +60,7 @@ func (p *provider) UpdateUser(ctx context.Context, user *models.User) (*models.U
}
_, err := p.db.Collection(models.Collections.User).Upsert(user.ID, user, &upsertOpt)
if err != nil {
- return user, err
+ return nil, err
}
return user, nil
}
@@ -110,11 +122,11 @@ func (p *provider) GetUserByEmail(ctx context.Context, email string) (*models.Us
PositionalParameters: []interface{}{email},
})
if err != nil {
- return user, err
+ return nil, err
}
err = q.One(&user)
if err != nil {
- return user, err
+ return nil, err
}
return user, nil
}
@@ -129,11 +141,11 @@ func (p *provider) GetUserByID(ctx context.Context, id string) (*models.User, er
PositionalParameters: []interface{}{id},
})
if err != nil {
- return user, err
+ return nil, err
}
err = q.One(&user)
if err != nil {
- return user, err
+ return nil, err
}
return user, nil
}
@@ -182,11 +194,11 @@ func (p *provider) GetUserByPhoneNumber(ctx context.Context, phoneNumber string)
PositionalParameters: []interface{}{phoneNumber},
})
if err != nil {
- return user, err
+ return nil, err
}
err = q.One(&user)
if err != nil {
- return user, err
+ return nil, err
}
return user, nil
}
diff --git a/server/db/providers/couchbase/verification_requests.go b/server/db/providers/couchbase/verification_requests.go
index 314f69a6a..4448eab74 100644
--- a/server/db/providers/couchbase/verification_requests.go
+++ b/server/db/providers/couchbase/verification_requests.go
@@ -25,7 +25,7 @@ func (p *provider) AddVerificationRequest(ctx context.Context, verificationReque
}
_, err := p.db.Collection(models.Collections.VerificationRequest).Insert(verificationRequest.ID, verificationRequest, &insertOpt)
if err != nil {
- return verificationRequest, err
+ return nil, err
}
return verificationRequest, nil
}
@@ -44,12 +44,12 @@ func (p *provider) GetVerificationRequestByToken(ctx context.Context, token stri
})
if err != nil {
- return verificationRequest, err
+ return nil, err
}
err = queryResult.One(&verificationRequest)
if err != nil {
- return verificationRequest, err
+ return nil, err
}
return verificationRequest, nil
}
@@ -69,7 +69,7 @@ func (p *provider) GetVerificationRequestByEmail(ctx context.Context, email stri
var verificationRequest *models.VerificationRequest
err = queryResult.One(&verificationRequest)
if err != nil {
- return verificationRequest, err
+ return nil, err
}
return verificationRequest, nil
}
diff --git a/server/db/providers/couchbase/webhook.go b/server/db/providers/couchbase/webhook.go
index 92b011192..23dea5e9e 100644
--- a/server/db/providers/couchbase/webhook.go
+++ b/server/db/providers/couchbase/webhook.go
@@ -29,7 +29,7 @@ func (p *provider) AddWebhook(ctx context.Context, webhook *models.Webhook) (*mo
}
_, err := p.db.Collection(models.Collections.Webhook).Insert(webhook.ID, webhook, &insertOpt)
if err != nil {
- return webhook.AsAPIWebhook(), err
+ return nil, err
}
return webhook.AsAPIWebhook(), nil
}
diff --git a/server/db/providers/couchbase/webhook_log.go b/server/db/providers/couchbase/webhook_log.go
index 0482394c8..fb1d08a92 100644
--- a/server/db/providers/couchbase/webhook_log.go
+++ b/server/db/providers/couchbase/webhook_log.go
@@ -25,7 +25,7 @@ func (p *provider) AddWebhookLog(ctx context.Context, webhookLog *models.Webhook
}
_, err := p.db.Collection(models.Collections.WebhookLog).Insert(webhookLog.ID, webhookLog, &insertOpt)
if err != nil {
- return webhookLog.AsAPIWebhookLog(), err
+ return nil, err
}
return webhookLog.AsAPIWebhookLog(), nil
}
diff --git a/server/db/providers/dynamodb/authenticator.go b/server/db/providers/dynamodb/authenticator.go
index 9fd5b5e7f..56ffea156 100644
--- a/server/db/providers/dynamodb/authenticator.go
+++ b/server/db/providers/dynamodb/authenticator.go
@@ -24,7 +24,7 @@ func (p *provider) AddAuthenticator(ctx context.Context, authenticators *models.
authenticators.UpdatedAt = time.Now().Unix()
err := collection.Put(authenticators).RunWithContext(ctx)
if err != nil {
- return authenticators, err
+ return nil, err
}
return authenticators, nil
}
@@ -35,7 +35,7 @@ func (p *provider) UpdateAuthenticator(ctx context.Context, authenticators *mode
authenticators.UpdatedAt = time.Now().Unix()
err := UpdateByHashKey(collection, "id", authenticators.ID, authenticators)
if err != nil {
- return authenticators, err
+ return nil, err
}
}
return authenticators, nil
@@ -51,7 +51,7 @@ func (p *provider) GetAuthenticatorDetailsByUserId(ctx context.Context, userId s
}
err := iter.Err()
if err != nil {
- return authenticators, err
+ return nil, err
}
return authenticators, nil
}
diff --git a/server/db/providers/dynamodb/env.go b/server/db/providers/dynamodb/env.go
index 0b356f782..2c788a799 100644
--- a/server/db/providers/dynamodb/env.go
+++ b/server/db/providers/dynamodb/env.go
@@ -21,7 +21,7 @@ func (p *provider) AddEnv(ctx context.Context, env *models.Env) (*models.Env, er
env.UpdatedAt = time.Now().Unix()
err := collection.Put(env).RunWithContext(ctx)
if err != nil {
- return env, err
+ return nil, err
}
return env, nil
}
@@ -32,7 +32,7 @@ func (p *provider) UpdateEnv(ctx context.Context, env *models.Env) (*models.Env,
env.UpdatedAt = time.Now().Unix()
err := UpdateByHashKey(collection, "id", env.ID, env)
if err != nil {
- return env, err
+ return nil, err
}
return env, nil
}
@@ -45,7 +45,7 @@ func (p *provider) GetEnv(ctx context.Context) (*models.Env, error) {
iter := collection.Scan().Limit(1).Iter()
for iter.NextWithContext(ctx, &env) {
if env == nil {
- return env, errors.New("no documets found")
+ return nil, errors.New("no documets found")
} else {
return env, nil
}
diff --git a/server/db/providers/dynamodb/user.go b/server/db/providers/dynamodb/user.go
index b843cb3a2..faa5badb4 100644
--- a/server/db/providers/dynamodb/user.go
+++ b/server/db/providers/dynamodb/user.go
@@ -26,20 +26,24 @@ func (p *provider) AddUser(ctx context.Context, user *models.User) (*models.User
if user.Roles == "" {
defaultRoles, err := memorystore.Provider.GetStringStoreEnvVariable(constants.EnvKeyDefaultRoles)
if err != nil {
- return user, err
+ return nil, err
}
user.Roles = defaultRoles
}
if user.PhoneNumber != nil && strings.TrimSpace(refs.StringValue(user.PhoneNumber)) != "" {
- if u, _ := p.GetUserByPhoneNumber(ctx, refs.StringValue(user.PhoneNumber)); u != nil {
+ if u, _ := p.GetUserByPhoneNumber(ctx, refs.StringValue(user.PhoneNumber)); u != nil && u.ID != user.ID {
return user, fmt.Errorf("user with given phone number already exists")
}
+ } else if user.Email != nil && strings.TrimSpace(refs.StringValue(user.Email)) != "" {
+ if u, _ := p.GetUserByEmail(ctx, refs.StringValue(user.Email)); u != nil && u.ID != user.ID {
+ return user, fmt.Errorf("user with given email already exists")
+ }
}
user.CreatedAt = time.Now().Unix()
user.UpdatedAt = time.Now().Unix()
err := collection.Put(user).RunWithContext(ctx)
if err != nil {
- return user, err
+ return nil, err
}
return user, nil
}
@@ -51,7 +55,7 @@ func (p *provider) UpdateUser(ctx context.Context, user *models.User) (*models.U
user.UpdatedAt = time.Now().Unix()
err := UpdateByHashKey(collection, "id", user.ID, user)
if err != nil {
- return user, err
+ return nil, err
}
}
return user, nil
@@ -122,7 +126,7 @@ func (p *provider) GetUserByEmail(ctx context.Context, email string) (*models.Us
user = users[0]
return user, nil
} else {
- return user, errors.New("no record found")
+ return nil, errors.New("no record found")
}
}
@@ -133,7 +137,7 @@ func (p *provider) GetUserByID(ctx context.Context, id string) (*models.User, er
err := collection.Get("id", id).OneWithContext(ctx, &user)
if err != nil {
if refs.StringValue(user.Email) == "" {
- return user, errors.New("no documets found")
+ return nil, errors.New("no documets found")
} else {
return user, nil
}
diff --git a/server/db/providers/dynamodb/verification_requests.go b/server/db/providers/dynamodb/verification_requests.go
index 5fdf07897..32bceb28d 100644
--- a/server/db/providers/dynamodb/verification_requests.go
+++ b/server/db/providers/dynamodb/verification_requests.go
@@ -19,7 +19,7 @@ func (p *provider) AddVerificationRequest(ctx context.Context, verificationReque
verificationRequest.UpdatedAt = time.Now().Unix()
err := collection.Put(verificationRequest).RunWithContext(ctx)
if err != nil {
- return verificationRequest, err
+ return nil, err
}
}
return verificationRequest, nil
@@ -35,7 +35,7 @@ func (p *provider) GetVerificationRequestByToken(ctx context.Context, token stri
}
err := iter.Err()
if err != nil {
- return verificationRequest, err
+ return nil, err
}
return verificationRequest, nil
}
@@ -50,7 +50,7 @@ func (p *provider) GetVerificationRequestByEmail(ctx context.Context, email stri
}
err := iter.Err()
if err != nil {
- return verificationRequest, err
+ return nil, err
}
return verificationRequest, nil
}
diff --git a/server/db/providers/dynamodb/webhook.go b/server/db/providers/dynamodb/webhook.go
index c50e1fb2d..ca47b71d3 100644
--- a/server/db/providers/dynamodb/webhook.go
+++ b/server/db/providers/dynamodb/webhook.go
@@ -91,7 +91,7 @@ func (p *provider) GetWebhookByID(ctx context.Context, webhookID string) (*model
return nil, err
}
if webhook.ID == "" {
- return webhook.AsAPIWebhook(), errors.New("no documets found")
+ return nil, errors.New("no documets found")
}
return webhook.AsAPIWebhook(), nil
}
diff --git a/server/db/providers/mongodb/authenticator.go b/server/db/providers/mongodb/authenticator.go
index f2d401f57..7dae455b0 100644
--- a/server/db/providers/mongodb/authenticator.go
+++ b/server/db/providers/mongodb/authenticator.go
@@ -26,7 +26,7 @@ func (p *provider) AddAuthenticator(ctx context.Context, authenticators *models.
authenticatorsCollection := p.db.Collection(models.Collections.Authenticators, options.Collection())
_, err := authenticatorsCollection.InsertOne(ctx, authenticators)
if err != nil {
- return authenticators, err
+ return nil, err
}
return authenticators, nil
}
@@ -36,7 +36,7 @@ func (p *provider) UpdateAuthenticator(ctx context.Context, authenticators *mode
authenticatorsCollection := p.db.Collection(models.Collections.Authenticators, options.Collection())
_, err := authenticatorsCollection.UpdateOne(ctx, bson.M{"_id": bson.M{"$eq": authenticators.ID}}, bson.M{"$set": authenticators})
if err != nil {
- return authenticators, err
+ return nil, err
}
return authenticators, nil
}
@@ -46,7 +46,7 @@ func (p *provider) GetAuthenticatorDetailsByUserId(ctx context.Context, userId s
authenticatorsCollection := p.db.Collection(models.Collections.Authenticators, options.Collection())
err := authenticatorsCollection.FindOne(ctx, bson.M{"user_id": userId, "method": authenticatorType}).Decode(&authenticators)
if err != nil {
- return authenticators, err
+ return nil, err
}
return authenticators, nil
}
diff --git a/server/db/providers/mongodb/env.go b/server/db/providers/mongodb/env.go
index b7256126f..f88163a5e 100644
--- a/server/db/providers/mongodb/env.go
+++ b/server/db/providers/mongodb/env.go
@@ -22,7 +22,7 @@ func (p *provider) AddEnv(ctx context.Context, env *models.Env) (*models.Env, er
configCollection := p.db.Collection(models.Collections.Env, options.Collection())
_, err := configCollection.InsertOne(ctx, env)
if err != nil {
- return env, err
+ return nil, err
}
return env, nil
}
@@ -33,7 +33,7 @@ func (p *provider) UpdateEnv(ctx context.Context, env *models.Env) (*models.Env,
configCollection := p.db.Collection(models.Collections.Env, options.Collection())
_, err := configCollection.UpdateOne(ctx, bson.M{"_id": bson.M{"$eq": env.ID}}, bson.M{"$set": env}, options.MergeUpdateOptions())
if err != nil {
- return env, err
+ return nil, err
}
return env, nil
}
@@ -44,13 +44,13 @@ func (p *provider) GetEnv(ctx context.Context) (*models.Env, error) {
configCollection := p.db.Collection(models.Collections.Env, options.Collection())
cursor, err := configCollection.Find(ctx, bson.M{}, options.Find())
if err != nil {
- return env, err
+ return nil, err
}
defer cursor.Close(ctx)
for cursor.Next(nil) {
err := cursor.Decode(&env)
if err != nil {
- return env, err
+ return nil, err
}
}
if env == nil {
diff --git a/server/db/providers/mongodb/user.go b/server/db/providers/mongodb/user.go
index 078322ebf..776c4fc97 100644
--- a/server/db/providers/mongodb/user.go
+++ b/server/db/providers/mongodb/user.go
@@ -2,12 +2,15 @@ package mongodb
import (
"context"
+ "fmt"
+ "strings"
"time"
"github.com/authorizerdev/authorizer/server/constants"
"github.com/authorizerdev/authorizer/server/db/models"
"github.com/authorizerdev/authorizer/server/graph/model"
"github.com/authorizerdev/authorizer/server/memorystore"
+ "github.com/authorizerdev/authorizer/server/refs"
"github.com/google/uuid"
log "github.com/sirupsen/logrus"
"go.mongodb.org/mongo-driver/bson"
@@ -23,17 +26,26 @@ func (p *provider) AddUser(ctx context.Context, user *models.User) (*models.User
if user.Roles == "" {
defaultRoles, err := memorystore.Provider.GetStringStoreEnvVariable(constants.EnvKeyDefaultRoles)
if err != nil {
- return user, err
+ return nil, err
}
user.Roles = defaultRoles
}
+ if user.PhoneNumber != nil && strings.TrimSpace(refs.StringValue(user.PhoneNumber)) != "" {
+ if u, _ := p.GetUserByPhoneNumber(ctx, refs.StringValue(user.PhoneNumber)); u != nil && u.ID != user.ID {
+ return user, fmt.Errorf("user with given phone number already exists")
+ }
+ } else if user.Email != nil && strings.TrimSpace(refs.StringValue(user.Email)) != "" {
+ if u, _ := p.GetUserByEmail(ctx, refs.StringValue(user.Email)); u != nil && u.ID != user.ID {
+ return user, fmt.Errorf("user with given email already exists")
+ }
+ }
user.CreatedAt = time.Now().Unix()
user.UpdatedAt = time.Now().Unix()
user.Key = user.ID
userCollection := p.db.Collection(models.Collections.User, options.Collection())
_, err := userCollection.InsertOne(ctx, user)
if err != nil {
- return user, err
+ return nil, err
}
return user, nil
}
@@ -44,7 +56,7 @@ func (p *provider) UpdateUser(ctx context.Context, user *models.User) (*models.U
userCollection := p.db.Collection(models.Collections.User, options.Collection())
_, err := userCollection.UpdateOne(ctx, bson.M{"_id": bson.M{"$eq": user.ID}}, bson.M{"$set": user}, options.MergeUpdateOptions())
if err != nil {
- return user, err
+ return nil, err
}
return user, nil
}
@@ -103,7 +115,7 @@ func (p *provider) GetUserByEmail(ctx context.Context, email string) (*models.Us
userCollection := p.db.Collection(models.Collections.User, options.Collection())
err := userCollection.FindOne(ctx, bson.M{"email": email}).Decode(&user)
if err != nil {
- return user, err
+ return nil, err
}
return user, nil
}
@@ -114,7 +126,7 @@ func (p *provider) GetUserByID(ctx context.Context, id string) (*models.User, er
userCollection := p.db.Collection(models.Collections.User, options.Collection())
err := userCollection.FindOne(ctx, bson.M{"_id": id}).Decode(&user)
if err != nil {
- return user, err
+ return nil, err
}
return user, nil
}
diff --git a/server/db/providers/mongodb/verification_requests.go b/server/db/providers/mongodb/verification_requests.go
index 532d8c8a8..a4088f1eb 100644
--- a/server/db/providers/mongodb/verification_requests.go
+++ b/server/db/providers/mongodb/verification_requests.go
@@ -22,7 +22,7 @@ func (p *provider) AddVerificationRequest(ctx context.Context, verificationReque
verificationRequestCollection := p.db.Collection(models.Collections.VerificationRequest, options.Collection())
_, err := verificationRequestCollection.InsertOne(ctx, verificationRequest)
if err != nil {
- return verificationRequest, err
+ return nil, err
}
}
@@ -36,7 +36,7 @@ func (p *provider) GetVerificationRequestByToken(ctx context.Context, token stri
verificationRequestCollection := p.db.Collection(models.Collections.VerificationRequest, options.Collection())
err := verificationRequestCollection.FindOne(ctx, bson.M{"token": token}).Decode(&verificationRequest)
if err != nil {
- return verificationRequest, err
+ return nil, err
}
return verificationRequest, nil
@@ -49,7 +49,7 @@ func (p *provider) GetVerificationRequestByEmail(ctx context.Context, email stri
verificationRequestCollection := p.db.Collection(models.Collections.VerificationRequest, options.Collection())
err := verificationRequestCollection.FindOne(ctx, bson.M{"email": email, "identifier": identifier}).Decode(&verificationRequest)
if err != nil {
- return verificationRequest, err
+ return nil, err
}
return verificationRequest, nil
diff --git a/server/db/providers/provider_template/user.go b/server/db/providers/provider_template/user.go
index 9f4c7f8e1..b84aa6316 100644
--- a/server/db/providers/provider_template/user.go
+++ b/server/db/providers/provider_template/user.go
@@ -2,12 +2,15 @@ package provider_template
import (
"context"
+ "fmt"
+ "strings"
"time"
"github.com/authorizerdev/authorizer/server/constants"
"github.com/authorizerdev/authorizer/server/db/models"
"github.com/authorizerdev/authorizer/server/graph/model"
"github.com/authorizerdev/authorizer/server/memorystore"
+ "github.com/authorizerdev/authorizer/server/refs"
"github.com/google/uuid"
)
@@ -19,10 +22,19 @@ func (p *provider) AddUser(ctx context.Context, user *models.User) (*models.User
if user.Roles == "" {
defaultRoles, err := memorystore.Provider.GetStringStoreEnvVariable(constants.EnvKeyDefaultRoles)
if err != nil {
- return user, err
+ return nil, err
}
user.Roles = defaultRoles
}
+ if user.PhoneNumber != nil && strings.TrimSpace(refs.StringValue(user.PhoneNumber)) != "" {
+ if u, _ := p.GetUserByPhoneNumber(ctx, refs.StringValue(user.PhoneNumber)); u != nil && u.ID != user.ID {
+ return user, fmt.Errorf("user with given phone number already exists")
+ }
+ } else if user.Email != nil && strings.TrimSpace(refs.StringValue(user.Email)) != "" {
+ if u, _ := p.GetUserByEmail(ctx, refs.StringValue(user.Email)); u != nil && u.ID != user.ID {
+ return user, fmt.Errorf("user with given email already exists")
+ }
+ }
user.CreatedAt = time.Now().Unix()
user.UpdatedAt = time.Now().Unix()
return user, nil
diff --git a/server/db/providers/sql/otp.go b/server/db/providers/sql/otp.go
index 5503a7df6..4bf9b11f3 100644
--- a/server/db/providers/sql/otp.go
+++ b/server/db/providers/sql/otp.go
@@ -7,33 +7,56 @@ import (
"github.com/authorizerdev/authorizer/server/db/models"
"github.com/google/uuid"
- "gorm.io/gorm/clause"
)
// UpsertOTP to add or update otp
-func (p *provider) UpsertOTP(ctx context.Context, otp *models.OTP) (*models.OTP, error) {
- if otp.ID == "" {
- otp.ID = uuid.New().String()
+func (p *provider) UpsertOTP(ctx context.Context, otpParam *models.OTP) (*models.OTP, error) {
+ if otpParam.ID == "" {
+ otpParam.ID = uuid.New().String()
}
// check if email or phone number is present
- if otp.Email == "" && otp.PhoneNumber == "" {
+ if otpParam.Email == "" && otpParam.PhoneNumber == "" {
return nil, errors.New("email or phone_number is required")
}
uniqueField := models.FieldNameEmail
- if otp.Email == "" && otp.PhoneNumber != "" {
+ if otpParam.Email == "" && otpParam.PhoneNumber != "" {
uniqueField = models.FieldNamePhoneNumber
}
- otp.Key = otp.ID
- otp.CreatedAt = time.Now().Unix()
+ var otp *models.OTP
+ if uniqueField == models.FieldNameEmail {
+ otp, _ = p.GetOTPByEmail(ctx, otpParam.Email)
+ } else {
+ otp, _ = p.GetOTPByPhoneNumber(ctx, otpParam.PhoneNumber)
+ }
+ shouldCreate := false
+ if otp == nil {
+ id := uuid.NewString()
+ otp = &models.OTP{
+ ID: id,
+ Key: id,
+ Otp: otpParam.Otp,
+ Email: otpParam.Email,
+ PhoneNumber: otpParam.PhoneNumber,
+ ExpiresAt: otpParam.ExpiresAt,
+ CreatedAt: time.Now().Unix(),
+ }
+ shouldCreate = true
+ } else {
+ otp.Otp = otpParam.Otp
+ otp.ExpiresAt = otpParam.ExpiresAt
+ }
otp.UpdatedAt = time.Now().Unix()
- res := p.db.Clauses(clause.OnConflict{
- Columns: []clause.Column{{Name: uniqueField}},
- DoUpdates: clause.AssignmentColumns([]string{"otp", "expires_at", "updated_at"}),
- }).Create(&otp)
- if res.Error != nil {
- return nil, res.Error
+ if shouldCreate {
+ result := p.db.Create(&otp)
+ if result.Error != nil {
+ return nil, result.Error
+ }
+ } else {
+ result := p.db.Save(&otp)
+ if result.Error != nil {
+ return nil, result.Error
+ }
}
-
return otp, nil
}
diff --git a/server/db/providers/sql/user.go b/server/db/providers/sql/user.go
index 5243ad65e..e0b61fe3d 100644
--- a/server/db/providers/sql/user.go
+++ b/server/db/providers/sql/user.go
@@ -13,7 +13,6 @@ import (
"github.com/authorizerdev/authorizer/server/refs"
"github.com/google/uuid"
"gorm.io/gorm"
- "gorm.io/gorm/clause"
)
// AddUser to save user information in database
@@ -25,25 +24,25 @@ func (p *provider) AddUser(ctx context.Context, user *models.User) (*models.User
if user.Roles == "" {
defaultRoles, err := memorystore.Provider.GetStringStoreEnvVariable(constants.EnvKeyDefaultRoles)
if err != nil {
- return user, err
+ return nil, err
}
user.Roles = defaultRoles
}
if user.PhoneNumber != nil && strings.TrimSpace(refs.StringValue(user.PhoneNumber)) != "" {
- if u, _ := p.GetUserByPhoneNumber(ctx, refs.StringValue(user.PhoneNumber)); u != nil {
+ if u, _ := p.GetUserByPhoneNumber(ctx, refs.StringValue(user.PhoneNumber)); u != nil && u.ID != user.ID {
return user, fmt.Errorf("user with given phone number already exists")
}
+ } else if user.Email != nil && strings.TrimSpace(refs.StringValue(user.Email)) != "" {
+ if u, _ := p.GetUserByEmail(ctx, refs.StringValue(user.Email)); u != nil && u.ID != user.ID {
+ return user, fmt.Errorf("user with given email already exists")
+ }
}
user.CreatedAt = time.Now().Unix()
user.UpdatedAt = time.Now().Unix()
user.Key = user.ID
- result := p.db.Clauses(
- clause.OnConflict{
- UpdateAll: true,
- Columns: []clause.Column{{Name: "email"}},
- }).Create(&user)
+ result := p.db.Create(&user)
if result.Error != nil {
return user, result.Error
@@ -113,7 +112,7 @@ func (p *provider) GetUserByEmail(ctx context.Context, email string) (*models.Us
var user *models.User
result := p.db.Where("email = ?", email).First(&user)
if result.Error != nil {
- return user, result.Error
+ return nil, result.Error
}
return user, nil
}
@@ -123,7 +122,7 @@ func (p *provider) GetUserByID(ctx context.Context, id string) (*models.User, er
var user *models.User
result := p.db.Where("id = ?", id).First(&user)
if result.Error != nil {
- return user, result.Error
+ return nil, result.Error
}
return user, nil
}
diff --git a/server/email/email_verification.go b/server/email/email_verification.go
index 51a99bcf3..7a3de2557 100644
--- a/server/email/email_verification.go
+++ b/server/email/email_verification.go
@@ -53,13 +53,13 @@ const (
- |
+ |
Hey there 👋
- We have received request to verify email for {{.org_name}}. If this is correct, please confirm your email address by clicking the button below.
+ We have received request to verify email for {{.organization.name}}. If this is correct, please confirm your email address by clicking the button below.
Confirm Email
|
diff --git a/server/graph/generated/generated.go b/server/graph/generated/generated.go
index 3ed5ffedb..c0fb1bd4d 100644
--- a/server/graph/generated/generated.go
+++ b/server/graph/generated/generated.go
@@ -103,6 +103,7 @@ type ComplexityRoot struct {
DisableLoginPage func(childComplexity int) int
DisableMagicLinkLogin func(childComplexity int) int
DisableMailOtpLogin func(childComplexity int) int
+ DisableMobileBasicAuthentication func(childComplexity int) int
DisableMultiFactorAuthentication func(childComplexity int) int
DisablePlayground func(childComplexity int) int
DisableRedisForEnv func(childComplexity int) int
@@ -753,6 +754,13 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in
return e.complexity.Env.DisableMailOtpLogin(childComplexity), true
+ case "Env.DISABLE_MOBILE_BASIC_AUTHENTICATION":
+ if e.complexity.Env.DisableMobileBasicAuthentication == nil {
+ break
+ }
+
+ return e.complexity.Env.DisableMobileBasicAuthentication(childComplexity), true
+
case "Env.DISABLE_MULTI_FACTOR_AUTHENTICATION":
if e.complexity.Env.DisableMultiFactorAuthentication == nil {
break
@@ -2543,6 +2551,7 @@ type Env {
RESET_PASSWORD_URL: String
DISABLE_EMAIL_VERIFICATION: Boolean!
DISABLE_BASIC_AUTHENTICATION: Boolean!
+ DISABLE_MOBILE_BASIC_AUTHENTICATION: Boolean!
DISABLE_MAGIC_LINK_LOGIN: Boolean!
DISABLE_LOGIN_PAGE: Boolean!
DISABLE_SIGN_UP: Boolean!
@@ -2674,6 +2683,7 @@ input UpdateEnvInput {
ADMIN_COOKIE_SECURE: Boolean
DISABLE_EMAIL_VERIFICATION: Boolean
DISABLE_BASIC_AUTHENTICATION: Boolean
+ DISABLE_MOBILE_BASIC_AUTHENTICATION: Boolean
DISABLE_MAGIC_LINK_LOGIN: Boolean
DISABLE_LOGIN_PAGE: Boolean
DISABLE_SIGN_UP: Boolean
@@ -2837,6 +2847,7 @@ input UpdateUserInput {
gender: String
birthdate: String
phone_number: String
+ phone_number_verified: Boolean
picture: String
roles: [String]
is_multi_factor_auth_enabled: Boolean
@@ -5849,6 +5860,50 @@ func (ec *executionContext) fieldContext_Env_DISABLE_BASIC_AUTHENTICATION(ctx co
return fc, nil
}
+func (ec *executionContext) _Env_DISABLE_MOBILE_BASIC_AUTHENTICATION(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) {
+ fc, err := ec.fieldContext_Env_DISABLE_MOBILE_BASIC_AUTHENTICATION(ctx, field)
+ if err != nil {
+ return graphql.Null
+ }
+ ctx = graphql.WithFieldContext(ctx, fc)
+ defer func() {
+ if r := recover(); r != nil {
+ ec.Error(ctx, ec.Recover(ctx, r))
+ ret = graphql.Null
+ }
+ }()
+ resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) {
+ ctx = rctx // use context from middleware stack in children
+ return obj.DisableMobileBasicAuthentication, nil
+ })
+ if err != nil {
+ ec.Error(ctx, err)
+ return graphql.Null
+ }
+ if resTmp == nil {
+ if !graphql.HasFieldError(ctx, fc) {
+ ec.Errorf(ctx, "must not be null")
+ }
+ return graphql.Null
+ }
+ res := resTmp.(bool)
+ fc.Result = res
+ return ec.marshalNBoolean2bool(ctx, field.Selections, res)
+}
+
+func (ec *executionContext) fieldContext_Env_DISABLE_MOBILE_BASIC_AUTHENTICATION(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
+ fc = &graphql.FieldContext{
+ Object: "Env",
+ Field: field,
+ IsMethod: false,
+ IsResolver: false,
+ Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
+ return nil, errors.New("field of type Boolean does not have child fields")
+ },
+ }
+ return fc, nil
+}
+
func (ec *executionContext) _Env_DISABLE_MAGIC_LINK_LOGIN(ctx context.Context, field graphql.CollectedField, obj *model.Env) (ret graphql.Marshaler) {
fc, err := ec.fieldContext_Env_DISABLE_MAGIC_LINK_LOGIN(ctx, field)
if err != nil {
@@ -11694,6 +11749,8 @@ func (ec *executionContext) fieldContext_Query__env(ctx context.Context, field g
return ec.fieldContext_Env_DISABLE_EMAIL_VERIFICATION(ctx, field)
case "DISABLE_BASIC_AUTHENTICATION":
return ec.fieldContext_Env_DISABLE_BASIC_AUTHENTICATION(ctx, field)
+ case "DISABLE_MOBILE_BASIC_AUTHENTICATION":
+ return ec.fieldContext_Env_DISABLE_MOBILE_BASIC_AUTHENTICATION(ctx, field)
case "DISABLE_MAGIC_LINK_LOGIN":
return ec.fieldContext_Env_DISABLE_MAGIC_LINK_LOGIN(ctx, field)
case "DISABLE_LOGIN_PAGE":
@@ -18288,7 +18345,7 @@ func (ec *executionContext) unmarshalInputUpdateEnvInput(ctx context.Context, ob
asMap[k] = v
}
- fieldsInOrder := [...]string{"ACCESS_TOKEN_EXPIRY_TIME", "ADMIN_SECRET", "CUSTOM_ACCESS_TOKEN_SCRIPT", "OLD_ADMIN_SECRET", "SMTP_HOST", "SMTP_PORT", "SMTP_USERNAME", "SMTP_PASSWORD", "SMTP_LOCAL_NAME", "SENDER_EMAIL", "SENDER_NAME", "JWT_TYPE", "JWT_SECRET", "JWT_PRIVATE_KEY", "JWT_PUBLIC_KEY", "ALLOWED_ORIGINS", "APP_URL", "RESET_PASSWORD_URL", "APP_COOKIE_SECURE", "ADMIN_COOKIE_SECURE", "DISABLE_EMAIL_VERIFICATION", "DISABLE_BASIC_AUTHENTICATION", "DISABLE_MAGIC_LINK_LOGIN", "DISABLE_LOGIN_PAGE", "DISABLE_SIGN_UP", "DISABLE_REDIS_FOR_ENV", "DISABLE_STRONG_PASSWORD", "DISABLE_MULTI_FACTOR_AUTHENTICATION", "ENFORCE_MULTI_FACTOR_AUTHENTICATION", "ROLES", "PROTECTED_ROLES", "DEFAULT_ROLES", "JWT_ROLE_CLAIM", "GOOGLE_CLIENT_ID", "GOOGLE_CLIENT_SECRET", "GITHUB_CLIENT_ID", "GITHUB_CLIENT_SECRET", "FACEBOOK_CLIENT_ID", "FACEBOOK_CLIENT_SECRET", "LINKEDIN_CLIENT_ID", "LINKEDIN_CLIENT_SECRET", "APPLE_CLIENT_ID", "APPLE_CLIENT_SECRET", "DISCORD_CLIENT_ID", "DISCORD_CLIENT_SECRET", "TWITTER_CLIENT_ID", "TWITTER_CLIENT_SECRET", "MICROSOFT_CLIENT_ID", "MICROSOFT_CLIENT_SECRET", "MICROSOFT_ACTIVE_DIRECTORY_TENANT_ID", "TWITCH_CLIENT_ID", "TWITCH_CLIENT_SECRET", "ORGANIZATION_NAME", "ORGANIZATION_LOGO", "DEFAULT_AUTHORIZE_RESPONSE_TYPE", "DEFAULT_AUTHORIZE_RESPONSE_MODE", "DISABLE_PLAYGROUND", "DISABLE_MAIL_OTP_LOGIN", "DISABLE_TOTP_LOGIN"}
+ fieldsInOrder := [...]string{"ACCESS_TOKEN_EXPIRY_TIME", "ADMIN_SECRET", "CUSTOM_ACCESS_TOKEN_SCRIPT", "OLD_ADMIN_SECRET", "SMTP_HOST", "SMTP_PORT", "SMTP_USERNAME", "SMTP_PASSWORD", "SMTP_LOCAL_NAME", "SENDER_EMAIL", "SENDER_NAME", "JWT_TYPE", "JWT_SECRET", "JWT_PRIVATE_KEY", "JWT_PUBLIC_KEY", "ALLOWED_ORIGINS", "APP_URL", "RESET_PASSWORD_URL", "APP_COOKIE_SECURE", "ADMIN_COOKIE_SECURE", "DISABLE_EMAIL_VERIFICATION", "DISABLE_BASIC_AUTHENTICATION", "DISABLE_MOBILE_BASIC_AUTHENTICATION", "DISABLE_MAGIC_LINK_LOGIN", "DISABLE_LOGIN_PAGE", "DISABLE_SIGN_UP", "DISABLE_REDIS_FOR_ENV", "DISABLE_STRONG_PASSWORD", "DISABLE_MULTI_FACTOR_AUTHENTICATION", "ENFORCE_MULTI_FACTOR_AUTHENTICATION", "ROLES", "PROTECTED_ROLES", "DEFAULT_ROLES", "JWT_ROLE_CLAIM", "GOOGLE_CLIENT_ID", "GOOGLE_CLIENT_SECRET", "GITHUB_CLIENT_ID", "GITHUB_CLIENT_SECRET", "FACEBOOK_CLIENT_ID", "FACEBOOK_CLIENT_SECRET", "LINKEDIN_CLIENT_ID", "LINKEDIN_CLIENT_SECRET", "APPLE_CLIENT_ID", "APPLE_CLIENT_SECRET", "DISCORD_CLIENT_ID", "DISCORD_CLIENT_SECRET", "TWITTER_CLIENT_ID", "TWITTER_CLIENT_SECRET", "MICROSOFT_CLIENT_ID", "MICROSOFT_CLIENT_SECRET", "MICROSOFT_ACTIVE_DIRECTORY_TENANT_ID", "TWITCH_CLIENT_ID", "TWITCH_CLIENT_SECRET", "ORGANIZATION_NAME", "ORGANIZATION_LOGO", "DEFAULT_AUTHORIZE_RESPONSE_TYPE", "DEFAULT_AUTHORIZE_RESPONSE_MODE", "DISABLE_PLAYGROUND", "DISABLE_MAIL_OTP_LOGIN", "DISABLE_TOTP_LOGIN"}
for _, k := range fieldsInOrder {
v, ok := asMap[k]
if !ok {
@@ -18493,6 +18550,15 @@ func (ec *executionContext) unmarshalInputUpdateEnvInput(ctx context.Context, ob
return it, err
}
it.DisableBasicAuthentication = data
+ case "DISABLE_MOBILE_BASIC_AUTHENTICATION":
+ var err error
+
+ ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("DISABLE_MOBILE_BASIC_AUTHENTICATION"))
+ data, err := ec.unmarshalOBoolean2áš–bool(ctx, v)
+ if err != nil {
+ return it, err
+ }
+ it.DisableMobileBasicAuthentication = data
case "DISABLE_MAGIC_LINK_LOGIN":
var err error
@@ -18985,7 +19051,7 @@ func (ec *executionContext) unmarshalInputUpdateUserInput(ctx context.Context, o
asMap[k] = v
}
- fieldsInOrder := [...]string{"id", "email", "email_verified", "given_name", "family_name", "middle_name", "nickname", "gender", "birthdate", "phone_number", "picture", "roles", "is_multi_factor_auth_enabled", "app_data"}
+ fieldsInOrder := [...]string{"id", "email", "email_verified", "given_name", "family_name", "middle_name", "nickname", "gender", "birthdate", "phone_number", "phone_number_verified", "picture", "roles", "is_multi_factor_auth_enabled", "app_data"}
for _, k := range fieldsInOrder {
v, ok := asMap[k]
if !ok {
@@ -19082,6 +19148,15 @@ func (ec *executionContext) unmarshalInputUpdateUserInput(ctx context.Context, o
return it, err
}
it.PhoneNumber = data
+ case "phone_number_verified":
+ var err error
+
+ ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("phone_number_verified"))
+ data, err := ec.unmarshalOBoolean2áš–bool(ctx, v)
+ if err != nil {
+ return it, err
+ }
+ it.PhoneNumberVerified = data
case "picture":
var err error
@@ -19672,6 +19747,11 @@ func (ec *executionContext) _Env(ctx context.Context, sel ast.SelectionSet, obj
if out.Values[i] == graphql.Null {
out.Invalids++
}
+ case "DISABLE_MOBILE_BASIC_AUTHENTICATION":
+ out.Values[i] = ec._Env_DISABLE_MOBILE_BASIC_AUTHENTICATION(ctx, field, obj)
+ if out.Values[i] == graphql.Null {
+ out.Invalids++
+ }
case "DISABLE_MAGIC_LINK_LOGIN":
out.Values[i] = ec._Env_DISABLE_MAGIC_LINK_LOGIN(ctx, field, obj)
if out.Values[i] == graphql.Null {
diff --git a/server/graph/model/models_gen.go b/server/graph/model/models_gen.go
index 544b34a9d..4f23faff3 100644
--- a/server/graph/model/models_gen.go
+++ b/server/graph/model/models_gen.go
@@ -93,6 +93,7 @@ type Env struct {
ResetPasswordURL *string `json:"RESET_PASSWORD_URL,omitempty"`
DisableEmailVerification bool `json:"DISABLE_EMAIL_VERIFICATION"`
DisableBasicAuthentication bool `json:"DISABLE_BASIC_AUTHENTICATION"`
+ DisableMobileBasicAuthentication bool `json:"DISABLE_MOBILE_BASIC_AUTHENTICATION"`
DisableMagicLinkLogin bool `json:"DISABLE_MAGIC_LINK_LOGIN"`
DisableLoginPage bool `json:"DISABLE_LOGIN_PAGE"`
DisableSignUp bool `json:"DISABLE_SIGN_UP"`
@@ -373,6 +374,7 @@ type UpdateEnvInput struct {
AdminCookieSecure *bool `json:"ADMIN_COOKIE_SECURE,omitempty"`
DisableEmailVerification *bool `json:"DISABLE_EMAIL_VERIFICATION,omitempty"`
DisableBasicAuthentication *bool `json:"DISABLE_BASIC_AUTHENTICATION,omitempty"`
+ DisableMobileBasicAuthentication *bool `json:"DISABLE_MOBILE_BASIC_AUTHENTICATION,omitempty"`
DisableMagicLinkLogin *bool `json:"DISABLE_MAGIC_LINK_LOGIN,omitempty"`
DisableLoginPage *bool `json:"DISABLE_LOGIN_PAGE,omitempty"`
DisableSignUp *bool `json:"DISABLE_SIGN_UP,omitempty"`
@@ -440,6 +442,7 @@ type UpdateUserInput struct {
Gender *string `json:"gender,omitempty"`
Birthdate *string `json:"birthdate,omitempty"`
PhoneNumber *string `json:"phone_number,omitempty"`
+ PhoneNumberVerified *bool `json:"phone_number_verified,omitempty"`
Picture *string `json:"picture,omitempty"`
Roles []*string `json:"roles,omitempty"`
IsMultiFactorAuthEnabled *bool `json:"is_multi_factor_auth_enabled,omitempty"`
diff --git a/server/graph/schema.graphqls b/server/graph/schema.graphqls
index fdb2f50dd..10cb56b37 100644
--- a/server/graph/schema.graphqls
+++ b/server/graph/schema.graphqls
@@ -158,6 +158,7 @@ type Env {
RESET_PASSWORD_URL: String
DISABLE_EMAIL_VERIFICATION: Boolean!
DISABLE_BASIC_AUTHENTICATION: Boolean!
+ DISABLE_MOBILE_BASIC_AUTHENTICATION: Boolean!
DISABLE_MAGIC_LINK_LOGIN: Boolean!
DISABLE_LOGIN_PAGE: Boolean!
DISABLE_SIGN_UP: Boolean!
@@ -289,6 +290,7 @@ input UpdateEnvInput {
ADMIN_COOKIE_SECURE: Boolean
DISABLE_EMAIL_VERIFICATION: Boolean
DISABLE_BASIC_AUTHENTICATION: Boolean
+ DISABLE_MOBILE_BASIC_AUTHENTICATION: Boolean
DISABLE_MAGIC_LINK_LOGIN: Boolean
DISABLE_LOGIN_PAGE: Boolean
DISABLE_SIGN_UP: Boolean
@@ -452,6 +454,7 @@ input UpdateUserInput {
gender: String
birthdate: String
phone_number: String
+ phone_number_verified: Boolean
picture: String
roles: [String]
is_multi_factor_auth_enabled: Boolean
diff --git a/server/handlers/oauth_callback.go b/server/handlers/oauth_callback.go
index 280b28d42..2a947d68f 100644
--- a/server/handlers/oauth_callback.go
+++ b/server/handlers/oauth_callback.go
@@ -617,7 +617,7 @@ func processAppleUserInfo(ctx context.Context, code string) (*models.User, error
}
}
- return user, err
+ return nil, err
}
func processDiscordUserInfo(ctx context.Context, code string) (*models.User, error) {
diff --git a/server/handlers/revoke_refresh_token.go b/server/handlers/revoke_refresh_token.go
index 632df2d0e..366efd72c 100644
--- a/server/handlers/revoke_refresh_token.go
+++ b/server/handlers/revoke_refresh_token.go
@@ -24,9 +24,13 @@ func RevokeRefreshTokenHandler() gin.HandlerFunc {
})
return
}
+ // get client ID
+ clientID := strings.TrimSpace(reqBody["client_id"]) // kept for backward compatibility // else we expect to be present as header
+ if clientID == "" {
+ clientID = gc.Request.Header.Get("x-authorizer-client-id")
+ }
// get fingerprint hash
refreshToken := strings.TrimSpace(reqBody["refresh_token"])
- clientID := strings.TrimSpace(reqBody["client_id"])
if clientID == "" {
log.Debug("Client ID is empty")
diff --git a/server/middlewares/client_check.go b/server/middlewares/client_check.go
new file mode 100644
index 000000000..269a07570
--- /dev/null
+++ b/server/middlewares/client_check.go
@@ -0,0 +1,29 @@
+package middlewares
+
+import (
+ "net/http"
+
+ "github.com/gin-gonic/gin"
+ log "github.com/sirupsen/logrus"
+
+ "github.com/authorizerdev/authorizer/server/constants"
+ "github.com/authorizerdev/authorizer/server/memorystore"
+)
+
+// ClientCheckMiddleware is a middleware to verify the client ID
+// Note: client ID is passed in the header
+func ClientCheckMiddleware() gin.HandlerFunc {
+ return func(c *gin.Context) {
+ clientID := c.Request.Header.Get("X-Authorizer-Client-ID")
+ if client, _ := memorystore.Provider.GetStringStoreEnvVariable(constants.EnvKeyClientID); clientID != "" && client != "" && client != clientID {
+ log.Debug("Client ID is invalid: ", clientID)
+ c.JSON(http.StatusBadRequest, gin.H{
+ "error": "invalid_client_id",
+ "error_description": "The client id is invalid",
+ })
+ return
+ }
+
+ c.Next()
+ }
+}
diff --git a/server/middlewares/cors.go b/server/middlewares/cors.go
index 2c9c5d144..514bf2aa5 100644
--- a/server/middlewares/cors.go
+++ b/server/middlewares/cors.go
@@ -14,7 +14,7 @@ func CORSMiddleware() gin.HandlerFunc {
}
c.Writer.Header().Set("Access-Control-Allow-Credentials", "true")
- c.Writer.Header().Set("Access-Control-Allow-Headers", "Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization, accept, origin, Cache-Control, X-Requested-With, X-authorizer-url")
+ c.Writer.Header().Set("Access-Control-Allow-Headers", "Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization, accept, origin, Cache-Control, X-Requested-With, X-authorizer-url, X-Forwarded-Proto, X-authorizer-client-id")
c.Writer.Header().Set("Access-Control-Allow-Methods", "POST, OPTIONS, GET, PUT")
if c.Request.Method == "OPTIONS" {
diff --git a/server/resolvers/env.go b/server/resolvers/env.go
index 198f718ba..541484bf6 100644
--- a/server/resolvers/env.go
+++ b/server/resolvers/env.go
@@ -205,6 +205,7 @@ func EnvResolver(ctx context.Context) (*model.Env, error) {
// bool vars
res.DisableEmailVerification = store[constants.EnvKeyDisableEmailVerification].(bool)
res.DisableBasicAuthentication = store[constants.EnvKeyDisableBasicAuthentication].(bool)
+ res.DisableMobileBasicAuthentication = store[constants.EnvKeyDisableMobileBasicAuthentication].(bool)
res.DisableMagicLinkLogin = store[constants.EnvKeyDisableMagicLinkLogin].(bool)
res.DisableLoginPage = store[constants.EnvKeyDisableLoginPage].(bool)
res.DisableSignUp = store[constants.EnvKeyDisableSignUp].(bool)
diff --git a/server/resolvers/login.go b/server/resolvers/login.go
index 2db420952..89b1ba232 100644
--- a/server/resolvers/login.go
+++ b/server/resolvers/login.go
@@ -83,6 +83,39 @@ func LoginResolver(ctx context.Context, params model.LoginInput) (*model.AuthRes
log.Debug("User access is revoked")
return res, fmt.Errorf(`user access has been revoked`)
}
+ isEmailServiceEnabled, err := memorystore.Provider.GetBoolStoreEnvVariable(constants.EnvKeyIsEmailServiceEnabled)
+ if err != nil || !isEmailServiceEnabled {
+ log.Debug("Email service not enabled: ", err)
+ }
+ isSMSServiceEnabled, err := memorystore.Provider.GetBoolStoreEnvVariable(constants.EnvKeyIsSMSServiceEnabled)
+ if err != nil || !isSMSServiceEnabled {
+ log.Debug("SMS service not enabled: ", err)
+ }
+ // If multi factor authentication is enabled and we need to generate OTP for mail / sms based MFA
+ generateOTP := func(expiresAt int64) (*models.OTP, error) {
+ otp := utils.GenerateOTP()
+ otpData, err := db.Provider.UpsertOTP(ctx, &models.OTP{
+ Email: refs.StringValue(user.Email),
+ PhoneNumber: refs.StringValue(user.PhoneNumber),
+ Otp: otp,
+ ExpiresAt: expiresAt,
+ })
+ if err != nil {
+ log.Debug("Failed to add otp: ", err)
+ return nil, err
+ }
+ return otpData, nil
+ }
+ setOTPMFaSession := func(expiresAt int64) error {
+ mfaSession := uuid.NewString()
+ err = memorystore.Provider.SetMfaSession(user.ID, mfaSession, expiresAt)
+ if err != nil {
+ log.Debug("Failed to add mfasession: ", err)
+ return err
+ }
+ cookie.SetMfaSession(gc, mfaSession)
+ return nil
+ }
if isEmailLogin {
if !strings.Contains(user.SignupMethods, constants.AuthRecipeMethodBasicAuth) {
log.Debug("User signup method is not basic auth")
@@ -90,8 +123,38 @@ func LoginResolver(ctx context.Context, params model.LoginInput) (*model.AuthRes
}
if user.EmailVerifiedAt == nil {
- log.Debug("User email is not verified")
- return res, fmt.Errorf(`email not verified`)
+ // Check if email service is enabled
+ // Send email verification via otp
+ if !isEmailServiceEnabled {
+ log.Debug("User email is not verified and email service is not enabled")
+ return res, fmt.Errorf(`email not verified`)
+ } else {
+ expiresAt := time.Now().Add(1 * time.Minute).Unix()
+ otpData, err := generateOTP(expiresAt)
+ if err != nil {
+ log.Debug("Failed to generate otp: ", err)
+ return nil, err
+ }
+ if err := setOTPMFaSession(expiresAt); err != nil {
+ log.Debug("Failed to set mfa session: ", err)
+ return nil, err
+ }
+ go func() {
+ // exec it as go routine so that we can reduce the api latency
+ if err := mailService.SendEmail([]string{email}, constants.VerificationTypeOTP, map[string]interface{}{
+ "user": user.ToMap(),
+ "organization": utils.GetOrganization(),
+ "otp": otpData.Otp,
+ }); err != nil {
+ log.Debug("Failed to send otp email: ", err)
+ }
+ utils.RegisterEvent(ctx, constants.UserLoginWebhookEvent, constants.AuthRecipeMethodBasicAuth, user)
+ }()
+ return &model.AuthResponse{
+ Message: "Please check email inbox for the OTP",
+ ShouldShowEmailOtpScreen: refs.NewBoolRef(isMobileLogin),
+ }, nil
+ }
}
} else {
if !strings.Contains(user.SignupMethods, constants.AuthRecipeMethodMobileBasicAuth) {
@@ -100,8 +163,34 @@ func LoginResolver(ctx context.Context, params model.LoginInput) (*model.AuthRes
}
if user.PhoneNumberVerifiedAt == nil {
- log.Debug("User phone number is not verified")
- return res, fmt.Errorf(`phone number is not verified`)
+ if !isSMSServiceEnabled {
+ log.Debug("User phone number is not verified")
+ return res, fmt.Errorf(`phone number is not verified and sms service is not enabled`)
+ } else {
+ expiresAt := time.Now().Add(1 * time.Minute).Unix()
+ otpData, err := generateOTP(expiresAt)
+ if err != nil {
+ log.Debug("Failed to generate otp: ", err)
+ return nil, err
+ }
+ if err := setOTPMFaSession(expiresAt); err != nil {
+ log.Debug("Failed to set mfa session: ", err)
+ return nil, err
+ }
+ go func() {
+ smsBody := strings.Builder{}
+ smsBody.WriteString("Your verification code is: ")
+ smsBody.WriteString(otpData.Otp)
+ utils.RegisterEvent(ctx, constants.UserLoginWebhookEvent, constants.AuthRecipeMethodMobileBasicAuth, user)
+ if err := smsproviders.SendSMS(phoneNumber, smsBody.String()); err != nil {
+ log.Debug("Failed to send sms: ", err)
+ }
+ }()
+ return &model.AuthResponse{
+ Message: "Please check text message for the OTP",
+ ShouldShowMobileOtpScreen: refs.NewBoolRef(isMobileLogin),
+ }, nil
+ }
}
}
err = bcrypt.CompareHashAndPassword([]byte(*user.Password), []byte(params.Password))
@@ -129,14 +218,6 @@ func LoginResolver(ctx context.Context, params model.LoginInput) (*model.AuthRes
if params.Scope != nil && len(scope) > 0 {
scope = params.Scope
}
- isEmailServiceEnabled, err := memorystore.Provider.GetBoolStoreEnvVariable(constants.EnvKeyIsEmailServiceEnabled)
- if err != nil || !isEmailServiceEnabled {
- log.Debug("Email service not enabled: ", err)
- }
- isSMSServiceEnabled, err := memorystore.Provider.GetBoolStoreEnvVariable(constants.EnvKeyIsSMSServiceEnabled)
- if err != nil || !isSMSServiceEnabled {
- log.Debug("SMS service not enabled: ", err)
- }
isMFADisabled, err := memorystore.Provider.GetBoolStoreEnvVariable(constants.EnvKeyDisableMultiFactorAuthentication)
if err != nil || !isMFADisabled {
@@ -157,44 +238,20 @@ func LoginResolver(ctx context.Context, params model.LoginInput) (*model.AuthRes
if err != nil || !isSMSOTPDisabled {
log.Debug("sms OTP service not enabled: ", err)
}
- setOTPMFaSession := func(expiresAt int64) error {
- mfaSession := uuid.NewString()
- err = memorystore.Provider.SetMfaSession(user.ID, mfaSession, expiresAt)
- if err != nil {
- log.Debug("Failed to add mfasession: ", err)
- return err
- }
- cookie.SetMfaSession(gc, mfaSession)
- return nil
- }
- // If multi factor authentication is enabled and we need to generate OTP for mail / sms based MFA
- generateOTP := func(expiresAt int64) (*models.OTP, error) {
- otp := utils.GenerateOTP()
- otpData, err := db.Provider.UpsertOTP(ctx, &models.OTP{
- Email: refs.StringValue(user.Email),
- PhoneNumber: refs.StringValue(user.PhoneNumber),
- Otp: otp,
- ExpiresAt: expiresAt,
- })
- if err != nil {
- log.Debug("Failed to add otp: ", err)
- return nil, err
- }
- return otpData, nil
- }
+
// If multi factor authentication is enabled and is email based login and email otp is enabled
if refs.BoolValue(user.IsMultiFactorAuthEnabled) && !isMFADisabled && !isMailOTPDisabled && isEmailServiceEnabled && isEmailLogin {
expiresAt := time.Now().Add(1 * time.Minute).Unix()
otpData, err := generateOTP(expiresAt)
+ if err != nil {
+ log.Debug("Failed to generate otp: ", err)
+ return nil, err
+ }
+ if err := setOTPMFaSession(expiresAt); err != nil {
+ log.Debug("Failed to set mfa session: ", err)
+ return nil, err
+ }
go func() {
- if err != nil {
- log.Debug("Failed to generate otp: ", err)
- return
- }
- if err := setOTPMFaSession(expiresAt); err != nil {
- log.Debug("Failed to set mfa session: ", err)
- return
- }
// exec it as go routine so that we can reduce the api latency
if err := mailService.SendEmail([]string{email}, constants.VerificationTypeOTP, map[string]interface{}{
"user": user.ToMap(),
@@ -214,15 +271,15 @@ func LoginResolver(ctx context.Context, params model.LoginInput) (*model.AuthRes
if refs.BoolValue(user.IsMultiFactorAuthEnabled) && !isMFADisabled && !isSMSOTPDisabled && isSMSServiceEnabled && isMobileLogin {
expiresAt := time.Now().Add(1 * time.Minute).Unix()
otpData, err := generateOTP(expiresAt)
+ if err != nil {
+ log.Debug("Failed to generate otp: ", err)
+ return nil, err
+ }
+ if err := setOTPMFaSession(expiresAt); err != nil {
+ log.Debug("Failed to set mfa session: ", err)
+ return nil, err
+ }
go func() {
- if err != nil {
- log.Debug("Failed to generate otp: ", err)
- return
- }
- if err := setOTPMFaSession(expiresAt); err != nil {
- log.Debug("Failed to set mfa session: ", err)
- return
- }
smsBody := strings.Builder{}
smsBody.WriteString("Your verification code is: ")
smsBody.WriteString(otpData.Otp)
diff --git a/server/resolvers/resend_otp.go b/server/resolvers/resend_otp.go
index 782d90cca..8b9ac842a 100644
--- a/server/resolvers/resend_otp.go
+++ b/server/resolvers/resend_otp.go
@@ -7,12 +7,14 @@ import (
"strings"
"time"
+ "github.com/google/uuid"
log "github.com/sirupsen/logrus"
"github.com/authorizerdev/authorizer/server/constants"
+ "github.com/authorizerdev/authorizer/server/cookie"
"github.com/authorizerdev/authorizer/server/db"
"github.com/authorizerdev/authorizer/server/db/models"
- emailHelper "github.com/authorizerdev/authorizer/server/email"
+ mailService "github.com/authorizerdev/authorizer/server/email"
"github.com/authorizerdev/authorizer/server/graph/model"
"github.com/authorizerdev/authorizer/server/memorystore"
"github.com/authorizerdev/authorizer/server/refs"
@@ -32,44 +34,42 @@ func ResendOTPResolver(ctx context.Context, params model.ResendOTPRequest) (*mod
log.Debug("Email or phone number is required")
return nil, errors.New("email or phone number is required")
}
+ gc, err := utils.GinContextFromContext(ctx)
+ if err != nil {
+ log.Debug("Failed to get GinContext: ", err)
+ return nil, err
+ }
var user *models.User
- var err error
+ var isEmailServiceEnabled, isSMSServiceEnabled bool
if email != "" {
- isEmailServiceEnabled, err := memorystore.Provider.GetBoolStoreEnvVariable(constants.EnvKeyIsEmailServiceEnabled)
+ isEmailServiceEnabled, err = memorystore.Provider.GetBoolStoreEnvVariable(constants.EnvKeyIsEmailServiceEnabled)
if err != nil || !isEmailServiceEnabled {
log.Debug("Email service not enabled: ", err)
return nil, errors.New("email service not enabled")
}
user, err = db.Provider.GetUserByEmail(ctx, email)
+ if err != nil {
+ log.Debug("Failed to get user by email: ", err)
+ return nil, fmt.Errorf(`user with this email/phone not found`)
+ }
} else {
- isSMSServiceEnabled, err := memorystore.Provider.GetBoolStoreEnvVariable(constants.EnvKeyIsEmailServiceEnabled)
+ isSMSServiceEnabled, err = memorystore.Provider.GetBoolStoreEnvVariable(constants.EnvKeyIsEmailServiceEnabled)
if err != nil || !isSMSServiceEnabled {
log.Debug("Email service not enabled: ", err)
return nil, errors.New("email service not enabled")
}
user, err = db.Provider.GetUserByPhoneNumber(ctx, phoneNumber)
+ if err != nil {
+ log.Debug("Failed to get user by phone: ", err)
+ return nil, fmt.Errorf(`user with this email/phone not found`)
+ }
}
- if err != nil {
- log.Debug("Failed to get user by email: ", err)
- return nil, fmt.Errorf(`user with this email/phone not found`)
- }
-
if user.RevokedTimestamp != nil {
log.Debug("User access is revoked")
return nil, fmt.Errorf(`user access has been revoked`)
}
- if email != "" && user.EmailVerifiedAt == nil {
- log.Debug("User email is not verified")
- return nil, fmt.Errorf(`email not verified`)
- }
-
- if phoneNumber != "" && user.PhoneNumberVerifiedAt == nil {
- log.Debug("User phone number is not verified")
- return nil, fmt.Errorf(`phone number not verified`)
- }
-
- if !refs.BoolValue(user.IsMultiFactorAuthEnabled) {
+ if !refs.BoolValue(user.IsMultiFactorAuthEnabled) && user.EmailVerifiedAt != nil && user.PhoneNumberVerifiedAt != nil {
log.Debug("User multi factor authentication is not enabled")
return nil, fmt.Errorf(`multi factor authentication not enabled`)
}
@@ -97,30 +97,63 @@ func ResendOTPResolver(ctx context.Context, params model.ResendOTPRequest) (*mod
Message: "Failed to get for given email",
}, errors.New("failed to get otp for given email")
}
-
- otp := utils.GenerateOTP()
- if _, err := db.Provider.UpsertOTP(ctx, &models.OTP{
- Email: refs.StringValue(user.Email),
- Otp: otp,
- ExpiresAt: time.Now().Add(1 * time.Minute).Unix(),
- }); err != nil {
- log.Debug("Error upserting otp: ", err)
+ // If multi factor authentication is enabled and we need to generate OTP for mail / sms based MFA
+ generateOTP := func(expiresAt int64) (*models.OTP, error) {
+ otp := utils.GenerateOTP()
+ otpData, err := db.Provider.UpsertOTP(ctx, &models.OTP{
+ Email: refs.StringValue(user.Email),
+ PhoneNumber: refs.StringValue(user.PhoneNumber),
+ Otp: otp,
+ ExpiresAt: expiresAt,
+ })
+ if err != nil {
+ log.Debug("Failed to add otp: ", err)
+ return nil, err
+ }
+ return otpData, nil
+ }
+ setOTPMFaSession := func(expiresAt int64) error {
+ mfaSession := uuid.NewString()
+ err = memorystore.Provider.SetMfaSession(user.ID, mfaSession, expiresAt)
+ if err != nil {
+ log.Debug("Failed to add mfasession: ", err)
+ return err
+ }
+ cookie.SetMfaSession(gc, mfaSession)
+ return nil
+ }
+ expiresAt := time.Now().Add(1 * time.Minute).Unix()
+ otpData, err = generateOTP(expiresAt)
+ if err != nil {
+ log.Debug("Failed to generate otp: ", err)
+ return nil, err
+ }
+ if err := setOTPMFaSession(expiresAt); err != nil {
+ log.Debug("Failed to set mfa session: ", err)
return nil, err
}
-
if email != "" {
- // exec it as go routine so that we can reduce the api latency
- go emailHelper.SendEmail([]string{email}, constants.VerificationTypeOTP, map[string]interface{}{
- "user": user.ToMap(),
- "organization": utils.GetOrganization(),
- "otp": otp,
- })
+ go func() {
+ // exec it as go routine so that we can reduce the api latency
+ if err := mailService.SendEmail([]string{email}, constants.VerificationTypeOTP, map[string]interface{}{
+ "user": user.ToMap(),
+ "organization": utils.GetOrganization(),
+ "otp": otpData.Otp,
+ }); err != nil {
+ log.Debug("Failed to send otp email: ", err)
+ }
+ utils.RegisterEvent(ctx, constants.UserLoginWebhookEvent, constants.AuthRecipeMethodBasicAuth, user)
+ }()
} else {
- smsBody := strings.Builder{}
- smsBody.WriteString("Your verification code is: ")
- smsBody.WriteString(otp)
- // exec it as go routine so that we can reduce the api latency
- go smsproviders.SendSMS(phoneNumber, smsBody.String())
+ go func() {
+ smsBody := strings.Builder{}
+ smsBody.WriteString("Your verification code is: ")
+ smsBody.WriteString(otpData.Otp)
+ utils.RegisterEvent(ctx, constants.UserLoginWebhookEvent, constants.AuthRecipeMethodMobileBasicAuth, user)
+ if err := smsproviders.SendSMS(phoneNumber, smsBody.String()); err != nil {
+ log.Debug("Failed to send sms: ", err)
+ }
+ }()
}
log.Info("OTP has been resent")
return &model.Response{
diff --git a/server/resolvers/signup.go b/server/resolvers/signup.go
index f947f2ce5..a42d24246 100644
--- a/server/resolvers/signup.go
+++ b/server/resolvers/signup.go
@@ -290,25 +290,26 @@ func SignupResolver(ctx context.Context, params model.SignUpInput) (*model.AuthR
} else if !disablePhoneVerification && isSMSServiceEnabled && isMobileSignup {
duration, _ := time.ParseDuration("10m")
smsCode := utils.GenerateOTP()
-
smsBody := strings.Builder{}
smsBody.WriteString("Your verification code is: ")
smsBody.WriteString(smsCode)
-
- // TODO: For those who enabled the webhook to call their sms vendor separately - sending the otp to their api
- if err != nil {
- log.Debug("error while upserting user: ", err.Error())
- return nil, err
- }
+ expiresAt := time.Now().Add(duration).Unix()
_, err = db.Provider.UpsertOTP(ctx, &models.OTP{
PhoneNumber: phoneNumber,
Otp: smsCode,
- ExpiresAt: time.Now().Add(duration).Unix(),
+ ExpiresAt: expiresAt,
})
if err != nil {
log.Debug("error while upserting OTP: ", err.Error())
return nil, err
}
+ mfaSession := uuid.NewString()
+ err = memorystore.Provider.SetMfaSession(user.ID, mfaSession, expiresAt)
+ if err != nil {
+ log.Debug("Failed to add mfasession: ", err)
+ return nil, err
+ }
+ cookie.SetMfaSession(gc, mfaSession)
go func() {
smsproviders.SendSMS(phoneNumber, smsBody.String())
utils.RegisterEvent(ctx, constants.UserCreatedWebhookEvent, constants.AuthRecipeMethodMobileBasicAuth, user)
diff --git a/server/resolvers/update_user.go b/server/resolvers/update_user.go
index 60c0b1558..006c9e994 100644
--- a/server/resolvers/update_user.go
+++ b/server/resolvers/update_user.go
@@ -48,7 +48,18 @@ func UpdateUserResolver(ctx context.Context, params model.UpdateUserInput) (*mod
"user_id": params.ID,
})
- if params.GivenName == nil && params.FamilyName == nil && params.Picture == nil && params.MiddleName == nil && params.Nickname == nil && params.Email == nil && params.Birthdate == nil && params.Gender == nil && params.PhoneNumber == nil && params.Roles == nil && params.IsMultiFactorAuthEnabled == nil && params.AppData == nil {
+ if params.GivenName == nil &&
+ params.FamilyName == nil &&
+ params.Picture == nil &&
+ params.MiddleName == nil &&
+ params.Nickname == nil &&
+ params.Email == nil &&
+ params.Birthdate == nil &&
+ params.Gender == nil &&
+ params.PhoneNumber == nil &&
+ params.Roles == nil &&
+ params.IsMultiFactorAuthEnabled == nil &&
+ params.AppData == nil {
log.Debug("No params to update")
return res, fmt.Errorf("please enter atleast one param to update")
}
@@ -142,6 +153,15 @@ func UpdateUserResolver(ctx context.Context, params model.UpdateUserInput) (*mod
user.EmailVerifiedAt = nil
}
}
+ if params.PhoneNumberVerified != nil {
+ if *params.PhoneNumberVerified {
+ now := time.Now().Unix()
+ user.PhoneNumberVerifiedAt = &now
+ } else {
+ user.PhoneNumberVerifiedAt = nil
+ }
+
+ }
if params.Email != nil && refs.StringValue(user.Email) != refs.StringValue(params.Email) {
// check if valid email
@@ -197,6 +217,24 @@ func UpdateUserResolver(ctx context.Context, params model.UpdateUserInput) (*mod
}
+ if params.PhoneNumber != nil && refs.StringValue(user.PhoneNumber) != refs.StringValue(params.PhoneNumber) {
+ phone := strings.TrimSpace(refs.StringValue(params.PhoneNumber))
+ if len(phone) < 10 || len(phone) > 15 {
+ log.Debug("Invalid phone number: ", *params.PhoneNumber)
+ return res, fmt.Errorf("invalid phone number")
+ }
+ // check if user with new phone number exists
+ _, err = db.Provider.GetUserByPhoneNumber(ctx, phone)
+ // err = nil means user exists
+ if err == nil {
+ log.Debug("User with phone number already exists: ", phone)
+ return res, fmt.Errorf("user with this phone number already exists")
+ }
+ go memorystore.Provider.DeleteAllUserSessions(user.ID)
+ user.PhoneNumber = &phone
+ user.PhoneNumberVerifiedAt = nil
+ }
+
rolesToSave := ""
if params.Roles != nil && len(params.Roles) > 0 {
currentRoles := strings.Split(user.Roles, ",")
@@ -237,7 +275,6 @@ func UpdateUserResolver(ctx context.Context, params model.UpdateUserInput) (*mod
if rolesToSave != "" {
user.Roles = rolesToSave
}
-
user, err = db.Provider.UpdateUser(ctx, user)
if err != nil {
log.Debug("Failed to update user: ", err)
diff --git a/server/routes/routes.go b/server/routes/routes.go
index fd8bf23da..0f25a0288 100644
--- a/server/routes/routes.go
+++ b/server/routes/routes.go
@@ -16,6 +16,7 @@ func InitRouter(log *logrus.Logger) *gin.Engine {
router.Use(middlewares.Logger(log), gin.Recovery())
router.Use(middlewares.GinContextToContextMiddleware())
router.Use(middlewares.CORSMiddleware())
+ router.Use(middlewares.ClientCheckMiddleware())
router.GET("/", handlers.RootHandler())
router.GET("/health", handlers.HealthHandler())
diff --git a/server/test/login_test.go b/server/test/login_test.go
index 6855b9490..83b68b791 100644
--- a/server/test/login_test.go
+++ b/server/test/login_test.go
@@ -28,9 +28,11 @@ func loginTests(t *testing.T, s TestSetup) {
Email: refs.NewStringRef(email),
Password: s.TestInfo.Password,
})
-
- assert.NotNil(t, err, "should fail because email is not verified")
- assert.Nil(t, res)
+ // access token should be empty as email is not verified
+ assert.NoError(t, err)
+ assert.NotNil(t, res)
+ assert.Nil(t, res.AccessToken)
+ assert.NotEmpty(t, res.Message)
verificationRequest, err := db.Provider.GetVerificationRequestByEmail(ctx, email, constants.VerificationTypeBasicAuthSignup)
assert.NoError(t, err)
assert.NotNil(t, verificationRequest)
diff --git a/server/test/mobile_login_test.go b/server/test/mobile_login_test.go
index d1ca1821b..fa0d5de3b 100644
--- a/server/test/mobile_login_test.go
+++ b/server/test/mobile_login_test.go
@@ -33,8 +33,12 @@ func mobileLoginTests(t *testing.T, s TestSetup) {
PhoneNumber: refs.NewStringRef(phoneNumber),
Password: s.TestInfo.Password,
})
- assert.NotNil(t, err, "should fail because phone is not verified")
- assert.Nil(t, res)
+ // access token should be empty as email is not verified
+ assert.NoError(t, err)
+ assert.NotNil(t, res)
+ assert.Nil(t, res.AccessToken)
+ assert.NotEmpty(t, res.Message)
+ assert.True(t, *res.ShouldShowMobileOtpScreen)
smsRequest, err := db.Provider.GetOTPByPhoneNumber(ctx, phoneNumber)
assert.NoError(t, err)
assert.NotEmpty(t, smsRequest.Otp)
diff --git a/server/test/resend_otp_test.go b/server/test/resend_otp_test.go
index 353e91622..20b169587 100644
--- a/server/test/resend_otp_test.go
+++ b/server/test/resend_otp_test.go
@@ -35,8 +35,11 @@ func resendOTPTest(t *testing.T, s TestSetup) {
Email: refs.NewStringRef(email),
Password: s.TestInfo.Password,
})
- assert.Error(t, err)
- assert.Nil(t, loginRes)
+ // access token should be empty as email is not verified
+ assert.NoError(t, err)
+ assert.NotNil(t, loginRes)
+ assert.Nil(t, loginRes.AccessToken)
+ assert.NotEmpty(t, loginRes.Message)
verificationRequest, err := db.Provider.GetVerificationRequestByEmail(ctx, email, constants.VerificationTypeBasicAuthSignup)
assert.Nil(t, err)
assert.Equal(t, email, verificationRequest.Email)
@@ -57,13 +60,6 @@ func resendOTPTest(t *testing.T, s TestSetup) {
memorystore.Provider.UpdateEnvVariable(constants.EnvKeyDisableMailOTPLogin, false)
memorystore.Provider.UpdateEnvVariable(constants.EnvKeyDisableTOTPLogin, true)
- // Resend otp should return error as no initial opt is being sent
- resendOtpRes, err := resolvers.ResendOTPResolver(ctx, model.ResendOTPRequest{
- Email: refs.NewStringRef(email),
- })
- assert.Error(t, err)
- assert.Nil(t, resendOtpRes)
-
// Login should not return error but access token should be empty as otp should have been sent
loginRes, err = resolvers.LoginResolver(ctx, model.LoginInput{
Email: refs.NewStringRef(email),
@@ -79,7 +75,7 @@ func resendOTPTest(t *testing.T, s TestSetup) {
assert.NotEmpty(t, otp.Otp)
// resend otp
- resendOtpRes, err = resolvers.ResendOTPResolver(ctx, model.ResendOTPRequest{
+ resendOtpRes, err := resolvers.ResendOTPResolver(ctx, model.ResendOTPRequest{
Email: refs.NewStringRef(email),
})
assert.NoError(t, err)
diff --git a/server/test/totp_login_test.go b/server/test/totp_login_test.go
index 8eef7953c..3b9321ef7 100644
--- a/server/test/totp_login_test.go
+++ b/server/test/totp_login_test.go
@@ -42,8 +42,11 @@ func totpLoginTest(t *testing.T, s TestSetup) {
Email: &email,
Password: s.TestInfo.Password,
})
- assert.Error(t, err)
- assert.Nil(t, loginRes)
+ // access token should be empty as email is not verified
+ assert.NoError(t, err)
+ assert.NotNil(t, loginRes)
+ assert.Nil(t, loginRes.AccessToken)
+ assert.NotEmpty(t, loginRes.Message)
verificationRequest, err := db.Provider.GetVerificationRequestByEmail(ctx, email, constants.VerificationTypeBasicAuthSignup)
assert.Nil(t, err)
assert.Equal(t, email, verificationRequest.Email)
diff --git a/server/test/verify_otp_test.go b/server/test/verify_otp_test.go
index c96593272..917505ef7 100644
--- a/server/test/verify_otp_test.go
+++ b/server/test/verify_otp_test.go
@@ -47,8 +47,10 @@ func verifyOTPTest(t *testing.T, s TestSetup) {
Email: refs.NewStringRef(email),
Password: s.TestInfo.Password,
})
- assert.NotNil(t, err, "email is not verified")
- assert.Nil(t, loginRes)
+ assert.NoError(t, err)
+ assert.NotNil(t, loginRes)
+ assert.Nil(t, loginRes.AccessToken)
+ assert.NotEmpty(t, loginRes.Message)
// Verify the email
verificationRequest, err := db.Provider.GetVerificationRequestByEmail(ctx, email, constants.VerificationTypeBasicAuthSignup)
|