diff --git a/.github/workflows/deploy-website.yml b/.github/workflows/deploy-website.yml
index a311d997..143675e2 100644
--- a/.github/workflows/deploy-website.yml
+++ b/.github/workflows/deploy-website.yml
@@ -45,7 +45,5 @@ jobs:
uses: skynetlabs/deploy-to-skynet-action@v2
with:
upload-dir: packages/website/public
- portal-url: https://skynetpro.net
- skynet-jwt: ${{ secrets.SKYNET_JWT }}
github-token: ${{ secrets.GITHUB_TOKEN }}
registry-seed: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' && secrets.WEBSITE_REGISTRY_SEED || '' }}
diff --git a/.github/workflows/nginx-lua-unit-tests.yml b/.github/workflows/nginx-lua-unit-tests.yml
index 514459fa..b86a4e04 100644
--- a/.github/workflows/nginx-lua-unit-tests.yml
+++ b/.github/workflows/nginx-lua-unit-tests.yml
@@ -4,8 +4,15 @@
name: Nginx Lua Unit Tests
on:
+ push:
+ branches:
+ - "master"
+ paths:
+ - ".github/workflows/nginx-lua-unit-tests.yml"
+ - "docker/nginx/libs/**.lua"
pull_request:
paths:
+ - ".github/workflows/nginx-lua-unit-tests.yml"
- "docker/nginx/libs/**.lua"
jobs:
@@ -25,9 +32,22 @@ jobs:
hererocks env --lua=5.1 -rlatest
source env/bin/activate
luarocks install busted
+ luarocks install luacov
luarocks install hasher
+ luarocks install luacheck
+
+ - name: Lint code
+ run: |
+ source env/bin/activate
+ luacheck docker/nginx/libs --std ngx_lua+busted
- name: Unit Tests
run: |
source env/bin/activate
- busted --verbose --pattern=spec --directory=docker/nginx/libs .
+ busted --verbose --coverage --pattern=spec --directory=docker/nginx/libs .
+ cd docker/nginx/libs && luacov
+
+ - uses: codecov/codecov-action@v2
+ with:
+ directory: docker/nginx/libs
+ flags: nginx-lua
diff --git a/docker/nginx/Dockerfile b/docker/nginx/Dockerfile
index 53944d8e..2093872c 100644
--- a/docker/nginx/Dockerfile
+++ b/docker/nginx/Dockerfile
@@ -16,6 +16,7 @@ COPY nginx.conf /usr/local/openresty/nginx/conf/nginx.conf
CMD [ "bash", "-c", \
"./mo < /etc/nginx/conf.d.templates/server.account.conf > /etc/nginx/conf.d/server.account.conf ; \
./mo < /etc/nginx/conf.d.templates/server.api.conf > /etc/nginx/conf.d/server.api.conf; \
+ ./mo < /etc/nginx/conf.d.templates/server.dnslink.conf > /etc/nginx/conf.d/server.dnslink.conf; \
./mo < /etc/nginx/conf.d.templates/server.hns.conf > /etc/nginx/conf.d/server.hns.conf; \
./mo < /etc/nginx/conf.d.templates/server.skylink.conf > /etc/nginx/conf.d/server.skylink.conf ; \
while :; do sleep 6h & wait ${!}; /usr/local/openresty/bin/openresty -s reload; done & \
diff --git a/docker/nginx/conf.d/server.dnslink.conf b/docker/nginx/conf.d.templates/server.dnslink.conf
similarity index 51%
rename from docker/nginx/conf.d/server.dnslink.conf
rename to docker/nginx/conf.d.templates/server.dnslink.conf
index c35536ea..d42ee245 100644
--- a/docker/nginx/conf.d/server.dnslink.conf
+++ b/docker/nginx/conf.d.templates/server.dnslink.conf
@@ -12,5 +12,14 @@ server {
ssl_certificate /etc/ssl/local-certificate.crt;
ssl_certificate_key /etc/ssl/local-certificate.key;
+ set_by_lua_block $skynet_portal_domain { return "{{PORTAL_DOMAIN}}" }
+ set_by_lua_block $skynet_server_domain {
+ -- fall back to portal domain if server domain is not defined
+ if "{{SERVER_DOMAIN}}" == "" then
+ return "{{PORTAL_DOMAIN}}"
+ end
+ return "{{SERVER_DOMAIN}}"
+ }
+
include /etc/nginx/conf.d/server/server.dnslink;
}
diff --git a/docker/nginx/conf.d/include/track-download b/docker/nginx/conf.d/include/track-download
index 408e4150..4e12fd41 100644
--- a/docker/nginx/conf.d/include/track-download
+++ b/docker/nginx/conf.d/include/track-download
@@ -16,7 +16,8 @@ log_by_lua_block {
})
if err or (res and res.status ~= ngx.HTTP_NO_CONTENT) then
- ngx.log(ngx.ERR, "Failed accounts service request /track/download/" .. skylink .. ": ", err or ("[HTTP " .. res.status .. "] " .. res.body))
+ local error_response = err or ("[HTTP " .. res.status .. "] " .. res.body)
+ ngx.log(ngx.ERR, "Failed accounts service request /track/download/" .. skylink .. ": ", error_response)
end
end
@@ -40,7 +41,8 @@ log_by_lua_block {
})
if err or (res and res.status ~= ngx.HTTP_OK) then
- ngx.log(ngx.ERR, "Failed malware-scanner request /scan/" .. skylink .. ": ", err or ("[HTTP " .. res.status .. "] " .. res.body))
+ local error_response = err or ("[HTTP " .. res.status .. "] " .. res.body)
+ ngx.log(ngx.ERR, "Failed malware-scanner request /scan/" .. skylink .. ": ", error_response)
end
end
diff --git a/docker/nginx/conf.d/include/track-registry b/docker/nginx/conf.d/include/track-registry
index 8e8ae1d4..2c840491 100644
--- a/docker/nginx/conf.d/include/track-registry
+++ b/docker/nginx/conf.d/include/track-registry
@@ -19,7 +19,8 @@ log_by_lua_block {
})
if err or (res and res.status ~= ngx.HTTP_NO_CONTENT) then
- ngx.log(ngx.ERR, "Failed accounts service request /track/registry/" .. registry_action .. ": ", err or ("[HTTP " .. res.status .. "] " .. res.body))
+ local error_response = err or ("[HTTP " .. res.status .. "] " .. res.body)
+ ngx.log(ngx.ERR, "Failed accounts service request /track/registry/" .. registry_action .. ": ", error_response)
end
end
diff --git a/docker/nginx/conf.d/include/track-upload b/docker/nginx/conf.d/include/track-upload
index edca6bd7..36b12b9e 100644
--- a/docker/nginx/conf.d/include/track-upload
+++ b/docker/nginx/conf.d/include/track-upload
@@ -15,7 +15,8 @@ log_by_lua_block {
})
if err or (res and res.status ~= ngx.HTTP_NO_CONTENT) then
- ngx.log(ngx.ERR, "Failed accounts service request /track/upload/" .. skylink .. ": ", err or ("[HTTP " .. res.status .. "] " .. res.body))
+ local error_response = err or ("[HTTP " .. res.status .. "] " .. res.body)
+ ngx.log(ngx.ERR, "Failed accounts service request /track/upload/" .. skylink .. ": ", error_response)
end
end
@@ -40,7 +41,8 @@ log_by_lua_block {
})
if err or (res and res.status ~= ngx.HTTP_OK) then
- ngx.log(ngx.ERR, "Failed malware-scanner request /scan/" .. skylink .. ": ", err or ("[HTTP " .. res.status .. "] " .. res.body))
+ local error_response = err or ("[HTTP " .. res.status .. "] " .. res.body)
+ ngx.log(ngx.ERR, "Failed malware-scanner request /scan/" .. skylink .. ": ", error_response)
end
end
diff --git a/docker/nginx/libs/basexx.lua b/docker/nginx/libs/basexx.lua
index b077ee9a..b53c7337 100644
--- a/docker/nginx/libs/basexx.lua
+++ b/docker/nginx/libs/basexx.lua
@@ -21,7 +21,7 @@ local function divide_string( str, max )
return result
end
-
+
local function number_to_bit( num, length )
local bits = {}
@@ -144,7 +144,7 @@ function basexx.to_basexx( str, alphabet, bits, pad )
end
table.insert( result, pad )
- return table.concat( result )
+ return table.concat( result )
end
--------------------------------------------------------------------------------
@@ -225,16 +225,16 @@ local function length_error( len, d )
end
local z85Decoder = { 0x00, 0x44, 0x00, 0x54, 0x53, 0x52, 0x48, 0x00,
- 0x4B, 0x4C, 0x46, 0x41, 0x00, 0x3F, 0x3E, 0x45,
- 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
- 0x08, 0x09, 0x40, 0x00, 0x49, 0x42, 0x4A, 0x47,
- 0x51, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A,
- 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, 0x31, 0x32,
- 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A,
- 0x3B, 0x3C, 0x3D, 0x4D, 0x00, 0x4E, 0x43, 0x00,
- 0x00, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10,
- 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
- 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20,
+ 0x4B, 0x4C, 0x46, 0x41, 0x00, 0x3F, 0x3E, 0x45,
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+ 0x08, 0x09, 0x40, 0x00, 0x49, 0x42, 0x4A, 0x47,
+ 0x51, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A,
+ 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, 0x31, 0x32,
+ 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A,
+ 0x3B, 0x3C, 0x3D, 0x4D, 0x00, 0x4E, 0x43, 0x00,
+ 0x00, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10,
+ 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
+ 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20,
0x21, 0x22, 0x23, 0x4F, 0x00, 0x50, 0x00, 0x00 }
function basexx.from_z85( str, ignore )
diff --git a/docker/nginx/libs/skynet/account.lua b/docker/nginx/libs/skynet/account.lua
index 5e0db371..6fa2c4d2 100644
--- a/docker/nginx/libs/skynet/account.lua
+++ b/docker/nginx/libs/skynet/account.lua
@@ -82,7 +82,8 @@ function _M.get_account_limits()
-- fail gracefully in case /user/limits failed
if err or (res and res.status ~= ngx.HTTP_OK) then
- ngx.log(ngx.ERR, "Failed accounts service request /user/limits?unit=byte: ", err or ("[HTTP " .. res.status .. "] " .. res.body))
+ local error_response = err or ("[HTTP " .. res.status .. "] " .. res.body)
+ ngx.log(ngx.ERR, "Failed accounts service request /user/limits?unit=byte: ", error_response)
ngx.var.account_limits = cjson.encode(anon_limits)
elseif res and res.status == ngx.HTTP_OK then
ngx.var.account_limits = res.body
@@ -109,7 +110,7 @@ function _M.has_subscription()
end
function _M.is_auth_required()
- -- authentication is required if mode is set to "authenticated"
+ -- authentication is required if mode is set to "authenticated"
-- or "subscription" (require active subscription to a premium plan)
return os.getenv("ACCOUNTS_LIMIT_ACCESS") == "authenticated" or _M.is_subscription_required()
end
@@ -118,7 +119,7 @@ function _M.is_subscription_required()
return os.getenv("ACCOUNTS_LIMIT_ACCESS") == "subscription"
end
-function is_access_always_allowed()
+local is_access_always_allowed = function ()
-- options requests do not attach cookies - should always be available
-- requests should not be limited based on accounts if accounts are not enabled
return ngx.req.get_method() == "OPTIONS" or not _M.accounts_enabled()
diff --git a/docker/nginx/libs/skynet/skylink.lua b/docker/nginx/libs/skynet/skylink.lua
index adcf0b70..86d1c4bc 100644
--- a/docker/nginx/libs/skynet/skylink.lua
+++ b/docker/nginx/libs/skynet/skylink.lua
@@ -27,7 +27,7 @@ function _M.hash(skylink)
-- parse with blake2b with key length of 32
local blake2bHashed = hasher.blake2b(rawMerkleRoot, 32)
-
+
-- hex encode the blake hash
local hexHashed = basexx.to_hex(blake2bHashed)
diff --git a/docker/nginx/libs/skynet/skylink.spec.lua b/docker/nginx/libs/skynet/skylink.spec.lua
index 0502a833..9977d7c8 100644
--- a/docker/nginx/libs/skynet/skylink.spec.lua
+++ b/docker/nginx/libs/skynet/skylink.spec.lua
@@ -7,7 +7,7 @@ describe("parse", function()
it("should return unchanged base64 skylink", function()
assert.is.same(skynet_skylink.parse(base64), base64)
end)
-
+
it("should transform base32 skylink into base64", function()
assert.is.same(skynet_skylink.parse(base32), base64)
end)
diff --git a/docker/nginx/libs/utils.spec.lua b/docker/nginx/libs/utils.spec.lua
index 8dd68e6e..c853c8cd 100644
--- a/docker/nginx/libs/utils.spec.lua
+++ b/docker/nginx/libs/utils.spec.lua
@@ -15,31 +15,31 @@ describe("extract_cookie", function()
it("should return nil if cookie string is nil", function()
local cookie = utils.extract_cookie_value(nil, "aaa")
-
+
assert.is_nil(cookie)
end)
it("should return nil if cookie name is not found", function()
local cookie = utils.extract_cookie(cookie_string, "foo")
-
+
assert.is_nil(cookie)
end)
it("should return cookie if cookie_string starts with that cookie name", function()
local cookie = utils.extract_cookie(cookie_string, "aaa")
-
+
assert.are.equals(cookie, "aaa=bbb")
end)
it("should return cookie if cookie_string ends with that cookie name", function()
local cookie = utils.extract_cookie(cookie_string, "xxx")
-
+
assert.are.equals(cookie, "xxx=yyy")
end)
it("should return cookie with custom matcher", function()
local cookie = utils.extract_cookie(cookie_string, "skynet[-]jwt")
-
+
assert.are.equals(cookie, "skynet-jwt=MTY0NzUyr8jD-ytiWtspm0tGabKfooxeIDuWcXhJ3lnY0eEw==")
end)
end)
@@ -49,31 +49,31 @@ describe("extract_cookie_value", function()
it("should return nil if cookie string is nil", function()
local value = utils.extract_cookie_value(nil, "aaa")
-
+
assert.is_nil(value)
end)
it("should return nil if cookie name is not found", function()
local value = utils.extract_cookie_value(cookie_string, "foo")
-
+
assert.is_nil(value)
end)
it("should return value if cookie_string starts with that cookie name", function()
local value = utils.extract_cookie_value(cookie_string, "aaa")
-
+
assert.are.equals(value, "bbb")
end)
it("should return cookie if cookie_string ends with that cookie name", function()
local value = utils.extract_cookie_value(cookie_string, "xxx")
-
+
assert.are.equals(value, "yyy")
end)
it("should return cookie with custom matcher", function()
local value = utils.extract_cookie_value(cookie_string, "skynet[-]jwt")
-
+
assert.are.equals(value, "MTY0NzUyr8jD-ytiWtspm0tGabKfooxeIDuWcXhJ3lnY0eEw==")
end)
end)
diff --git a/packages/dashboard-v2/README.md b/packages/dashboard-v2/README.md
index ba9db568..ab0421f8 100644
--- a/packages/dashboard-v2/README.md
+++ b/packages/dashboard-v2/README.md
@@ -8,3 +8,18 @@ This is a Gatsby application. To run it locally, all you need is:
- `yarn install`
- `yarn start`
+
+## Accessing remote APIs
+
+To be able to log in on a local environment with your production credentials, you'll need to make the browser believe you're actually on the same domain, otherwise the browser will block the session cookie.
+
+To do the trick, edit your `/etc/hosts` file and add a record like this:
+
+```
+127.0.0.1 local.skynetpro.net
+```
+
+then run `yarn develop:secure` -- it will run `gatsby develop` with `--https --host=local.skynetpro.net -p=443` options.
+If you're on macOS, you may need to `sudo` the command to successfully bind to port `443`.
+
+> **NOTE:** This should become easier once we have a docker image for the new dashboard.
diff --git a/packages/dashboard-v2/gatsby-browser.js b/packages/dashboard-v2/gatsby-browser.js
index a71e49c3..a39bdb48 100644
--- a/packages/dashboard-v2/gatsby-browser.js
+++ b/packages/dashboard-v2/gatsby-browser.js
@@ -6,8 +6,14 @@ import "@fontsource/sora/600.css"; // semibold
import "@fontsource/source-sans-pro/400.css"; // normal
import "@fontsource/source-sans-pro/600.css"; // semibold
import "./src/styles/global.css";
+import { MODAL_ROOT_ID } from "./src/components/Modal";
export function wrapPageElement({ element, props }) {
const Layout = element.type.Layout ?? React.Fragment;
- return {element} ;
+ return (
+
+ {element}
+
+
+ );
}
diff --git a/packages/dashboard-v2/gatsby-config.js b/packages/dashboard-v2/gatsby-config.js
index 017a4dfc..ce35de3a 100644
--- a/packages/dashboard-v2/gatsby-config.js
+++ b/packages/dashboard-v2/gatsby-config.js
@@ -5,6 +5,7 @@ module.exports = {
title: `Accounts Dashboard`,
siteUrl: `https://www.yourdomain.tld`,
},
+ trailingSlash: "never",
plugins: [
"gatsby-plugin-image",
"gatsby-plugin-provide-react",
@@ -26,7 +27,7 @@ module.exports = {
app.use(
"/api/",
createProxyMiddleware({
- target: "https://account.siasky.net",
+ target: "https://account.skynetpro.net",
secure: false, // Do not reject self-signed certificates.
changeOrigin: true,
})
diff --git a/packages/dashboard-v2/gatsby-ssr.js b/packages/dashboard-v2/gatsby-ssr.js
index a71e49c3..a39bdb48 100644
--- a/packages/dashboard-v2/gatsby-ssr.js
+++ b/packages/dashboard-v2/gatsby-ssr.js
@@ -6,8 +6,14 @@ import "@fontsource/sora/600.css"; // semibold
import "@fontsource/source-sans-pro/400.css"; // normal
import "@fontsource/source-sans-pro/600.css"; // semibold
import "./src/styles/global.css";
+import { MODAL_ROOT_ID } from "./src/components/Modal";
export function wrapPageElement({ element, props }) {
const Layout = element.type.Layout ?? React.Fragment;
- return {element} ;
+ return (
+
+ {element}
+
+
+ );
}
diff --git a/packages/dashboard-v2/package.json b/packages/dashboard-v2/package.json
index 7b561154..44f7595d 100644
--- a/packages/dashboard-v2/package.json
+++ b/packages/dashboard-v2/package.json
@@ -9,6 +9,7 @@
],
"scripts": {
"develop": "gatsby develop",
+ "develop:secure": "gatsby develop --https --host=local.skynetpro.net -p=443",
"start": "gatsby develop",
"build": "gatsby build",
"serve": "gatsby serve",
@@ -24,9 +25,11 @@
"classnames": "^2.3.1",
"copy-text-to-clipboard": "^3.0.1",
"dayjs": "^1.10.8",
+ "formik": "^2.2.9",
"gatsby": "^4.6.2",
"gatsby-plugin-postcss": "^5.7.0",
"http-status-codes": "^2.2.0",
+ "ky": "^0.30.0",
"nanoid": "^3.3.1",
"path-browserify": "^1.0.1",
"postcss": "^8.4.6",
@@ -38,7 +41,8 @@
"react-use": "^17.3.2",
"skynet-js": "^3.0.2",
"swr": "^1.2.2",
- "tailwindcss": "^3.0.23"
+ "tailwindcss": "^3.0.23",
+ "yup": "^0.32.11"
},
"devDependencies": {
"@babel/core": "^7.17.4",
diff --git a/packages/dashboard-v2/src/components/APIKeyList/APIKey.js b/packages/dashboard-v2/src/components/APIKeyList/APIKey.js
new file mode 100644
index 00000000..5cb6680a
--- /dev/null
+++ b/packages/dashboard-v2/src/components/APIKeyList/APIKey.js
@@ -0,0 +1,145 @@
+import dayjs from "dayjs";
+import cn from "classnames";
+import { useCallback, useState } from "react";
+
+import { Alert } from "../Alert";
+import { Button } from "../Button";
+import { AddSkylinkToAPIKeyForm } from "../forms/AddSkylinkToAPIKeyForm";
+import { CogIcon, TrashIcon } from "../Icons";
+import { Modal } from "../Modal";
+
+import { useAPIKeyEdit } from "./useAPIKeyEdit";
+import { useAPIKeyRemoval } from "./useAPIKeyRemoval";
+
+export const APIKey = ({ apiKey, onRemoved, onEdited, onRemovalError }) => {
+ const { id, name, createdAt, skylinks } = apiKey;
+ const isPublic = apiKey.public === "true";
+ const [error, setError] = useState(null);
+
+ const onSkylinkListEdited = useCallback(() => {
+ setError(null);
+ onEdited();
+ }, [onEdited]);
+
+ const onSkylinkListEditFailure = (errorMessage) => setError(errorMessage);
+
+ const {
+ removalError,
+ removalInitiated,
+ prompt: promptRemoval,
+ abort: abortRemoval,
+ confirm: confirmRemoval,
+ } = useAPIKeyRemoval({
+ key: apiKey,
+ onSuccess: onRemoved,
+ onFailure: onRemovalError,
+ });
+
+ const {
+ editInitiated,
+ prompt: promptEdit,
+ abort: abortEdit,
+ addSkylink,
+ removeSkylink,
+ } = useAPIKeyEdit({
+ key: apiKey,
+ onSkylinkListUpdate: onSkylinkListEdited,
+ onSkylinkListUpdateFailure: onSkylinkListEditFailure,
+ });
+
+ const closeEditModal = useCallback(() => {
+ setError(null);
+ abortEdit();
+ }, [abortEdit]);
+
+ const skylinksNumber = skylinks?.length ?? 0;
+ const isNotConfigured = isPublic && skylinksNumber === 0;
+ const skylinksPhrasePrefix = skylinksNumber === 0 ? "No" : skylinksNumber;
+ const skylinksPhrase = `${skylinksPhrasePrefix} ${skylinksNumber === 1 ? "skylink" : "skylinks"} configured`;
+
+ return (
+
+
+
+ {name || "unnamed key"}
+
+ {skylinksPhrase}
+
+
+
+
+ {dayjs(createdAt).format("MMM DD, YYYY")}
+
+ {isPublic && (
+
+
+
+ )}
+
+
+
+
+
+ {removalInitiated && (
+
+ Delete API key
+
+
Are you sure you want to delete the following API key?
+
{name || id}
+
+ {removalError && {removalError} }
+
+
+
+ Cancel
+
+ Delete
+
+
+ )}
+ {editInitiated && (
+
+ Covered skylinks
+ {skylinks?.length > 0 ? (
+
+ {skylinks.map((skylink) => (
+
+
+ {skylink}
+
+ removeSkylink(skylink)}>
+
+
+
+ ))}
+
+ ) : (
+ No skylinks here yet. You can add the first one below 🙃
+ )}
+
+
+
+ Close
+
+
+ )}
+
+ );
+};
diff --git a/packages/dashboard-v2/src/components/APIKeyList/APIKeyList.js b/packages/dashboard-v2/src/components/APIKeyList/APIKeyList.js
new file mode 100644
index 00000000..3d3e504d
--- /dev/null
+++ b/packages/dashboard-v2/src/components/APIKeyList/APIKeyList.js
@@ -0,0 +1,14 @@
+import { APIKey } from "./APIKey";
+
+export const APIKeyList = ({ keys, reloadKeys, title }) => {
+ return (
+ <>
+ {title}
+
+ {keys.map((key) => (
+
+ ))}
+
+ >
+ );
+};
diff --git a/packages/dashboard-v2/src/components/APIKeyList/index.js b/packages/dashboard-v2/src/components/APIKeyList/index.js
new file mode 100644
index 00000000..8ade7744
--- /dev/null
+++ b/packages/dashboard-v2/src/components/APIKeyList/index.js
@@ -0,0 +1 @@
+export * from "./APIKeyList";
diff --git a/packages/dashboard-v2/src/components/APIKeyList/useAPIKeyEdit.js b/packages/dashboard-v2/src/components/APIKeyList/useAPIKeyEdit.js
new file mode 100644
index 00000000..a821ca02
--- /dev/null
+++ b/packages/dashboard-v2/src/components/APIKeyList/useAPIKeyEdit.js
@@ -0,0 +1,43 @@
+import { useCallback, useState } from "react";
+import accountsService from "../../services/accountsService";
+
+export const useAPIKeyEdit = ({ key, onSkylinkListUpdate, onSkylinkListUpdateFailure }) => {
+ const [editInitiated, setEditInitiated] = useState(false);
+
+ const prompt = () => setEditInitiated(true);
+ const abort = () => setEditInitiated(false);
+ const updateSkylinkList = useCallback(
+ async (action, skylink) => {
+ try {
+ await accountsService.patch(`user/apikeys/${key.id}`, {
+ json: {
+ [action]: [skylink],
+ },
+ });
+ onSkylinkListUpdate();
+
+ return true;
+ } catch (err) {
+ if (err.response) {
+ const { message } = await err.response.json();
+ onSkylinkListUpdateFailure(message);
+ } else {
+ onSkylinkListUpdateFailure("Unknown error occured, please try again.");
+ }
+
+ return false;
+ }
+ },
+ [onSkylinkListUpdate, onSkylinkListUpdateFailure, key]
+ );
+ const addSkylink = (skylink) => updateSkylinkList("add", skylink);
+ const removeSkylink = (skylink) => updateSkylinkList("remove", skylink);
+
+ return {
+ editInitiated,
+ prompt,
+ abort,
+ addSkylink,
+ removeSkylink,
+ };
+};
diff --git a/packages/dashboard-v2/src/components/APIKeyList/useAPIKeyRemoval.js b/packages/dashboard-v2/src/components/APIKeyList/useAPIKeyRemoval.js
new file mode 100644
index 00000000..b9c53bd9
--- /dev/null
+++ b/packages/dashboard-v2/src/components/APIKeyList/useAPIKeyRemoval.js
@@ -0,0 +1,41 @@
+import { useCallback, useState } from "react";
+import accountsService from "../../services/accountsService";
+
+export const useAPIKeyRemoval = ({ key, onSuccess }) => {
+ const [removalInitiated, setRemovalInitiated] = useState(false);
+ const [removalError, setRemovalError] = useState(null);
+
+ const prompt = () => {
+ setRemovalError(null);
+ setRemovalInitiated(true);
+ };
+ const abort = () => setRemovalInitiated(false);
+
+ const confirm = useCallback(async () => {
+ setRemovalError(null);
+ try {
+ await accountsService.delete(`user/apikeys/${key.id}`);
+ setRemovalInitiated(false);
+ onSuccess();
+ } catch (err) {
+ let message = "There was an error processing your request. Please try again later.";
+
+ if (err.response) {
+ const response = await err.response.json();
+ if (response.message) {
+ message = response.message;
+ }
+ }
+
+ setRemovalError(message);
+ }
+ }, [onSuccess, key]);
+
+ return {
+ removalInitiated,
+ removalError,
+ prompt,
+ abort,
+ confirm,
+ };
+};
diff --git a/packages/dashboard-v2/src/components/Alert/Alert.js b/packages/dashboard-v2/src/components/Alert/Alert.js
new file mode 100644
index 00000000..4db72620
--- /dev/null
+++ b/packages/dashboard-v2/src/components/Alert/Alert.js
@@ -0,0 +1,10 @@
+import styled from "styled-components";
+import cn from "classnames";
+
+export const Alert = styled.div.attrs(({ $variant }) => ({
+ className: cn("px-3 py-2 sm:px-6 sm:py-4 rounded border", {
+ "bg-blue-100 border-blue-200 text-palette-400": $variant === "info",
+ "bg-red-100 border-red-200 text-error": $variant === "error",
+ "bg-green-100 border-green-200 text-palette-400": $variant === "success",
+ }),
+}))``;
diff --git a/packages/dashboard-v2/src/components/Alert/index.js b/packages/dashboard-v2/src/components/Alert/index.js
new file mode 100644
index 00000000..b8e17a03
--- /dev/null
+++ b/packages/dashboard-v2/src/components/Alert/index.js
@@ -0,0 +1 @@
+export * from "./Alert";
diff --git a/packages/dashboard-v2/src/components/Button/Button.js b/packages/dashboard-v2/src/components/Button/Button.js
index 48cedb15..328d52cd 100644
--- a/packages/dashboard-v2/src/components/Button/Button.js
+++ b/packages/dashboard-v2/src/components/Button/Button.js
@@ -5,8 +5,8 @@ import styled from "styled-components";
/**
* Primary UI component for user interaction
*/
-export const Button = styled.button.attrs(({ disabled, $primary }) => ({
- type: "button",
+export const Button = styled.button.attrs(({ disabled, $primary, type }) => ({
+ type,
className: cn("px-6 py-2.5 rounded-full font-sans uppercase text-xs tracking-wide transition-[opacity_filter]", {
"bg-primary text-palette-600": $primary,
"bg-white border-2 border-black text-palette-600": !$primary,
@@ -14,6 +14,7 @@ export const Button = styled.button.attrs(({ disabled, $primary }) => ({
"hover:brightness-90": !disabled,
}),
}))``;
+
Button.propTypes = {
/**
* Is this the principal call to action on the page?
@@ -23,9 +24,14 @@ Button.propTypes = {
* Prevent interaction on the button
*/
disabled: PropTypes.bool,
+ /**
+ * Type of button (button / submit)
+ */
+ type: PropTypes.oneOf(["button", "submit"]),
};
Button.defaultProps = {
$primary: false,
disabled: false,
+ type: "button",
};
diff --git a/packages/dashboard-v2/src/components/Form/TextField.js b/packages/dashboard-v2/src/components/Form/TextField.js
new file mode 100644
index 00000000..6ae35021
--- /dev/null
+++ b/packages/dashboard-v2/src/components/Form/TextField.js
@@ -0,0 +1,56 @@
+import PropTypes from "prop-types";
+import cn from "classnames";
+import { Field } from "formik";
+
+export const TextField = ({ id, label, name, error, touched, className, ...props }) => {
+ return (
+
+ {label && (
+
+ {label}
+
+ )}
+
+ {touched && error && (
+
+ {error}
+
+ )}
+
+ );
+};
+
+/** Besides noted properties, it accepts all props accepted by:
+ * - a regular element
+ * - Formik's component
+ */
+TextField.propTypes = {
+ /**
+ * ID for the field. Used to couple and elements
+ */
+ id: PropTypes.string,
+ /**
+ * Label for the field
+ */
+ label: PropTypes.string,
+ /**
+ * Name of the field
+ */
+ name: PropTypes.string.isRequired,
+ /**
+ * Validation error message
+ */
+ error: PropTypes.string,
+ /**
+ * Indicates wether or not the user touched the field already.
+ */
+ touched: PropTypes.bool,
+};
diff --git a/packages/dashboard-v2/src/components/Form/index.js b/packages/dashboard-v2/src/components/Form/index.js
new file mode 100644
index 00000000..79aaa711
--- /dev/null
+++ b/packages/dashboard-v2/src/components/Form/index.js
@@ -0,0 +1 @@
+export * from "./TextField";
diff --git a/packages/dashboard-v2/src/components/HighlightedLink.js b/packages/dashboard-v2/src/components/HighlightedLink.js
new file mode 100644
index 00000000..5fa6b079
--- /dev/null
+++ b/packages/dashboard-v2/src/components/HighlightedLink.js
@@ -0,0 +1,6 @@
+import { Link } from "gatsby";
+import styled from "styled-components";
+
+export default styled(Link).attrs({
+ className: "text-primary underline-offset-3 decoration-dotted hover:text-primary-light hover:underline",
+})``;
diff --git a/packages/dashboard-v2/src/components/Icons/icons/ImportantNoteIcon.js b/packages/dashboard-v2/src/components/Icons/icons/ImportantNoteIcon.js
new file mode 100644
index 00000000..94514716
--- /dev/null
+++ b/packages/dashboard-v2/src/components/Icons/icons/ImportantNoteIcon.js
@@ -0,0 +1,11 @@
+import { withIconProps } from "../withIconProps";
+
+export const ImportantNoteIcon = withIconProps(({ size, ...props }) => (
+
+
+
+
+
+
+
+));
diff --git a/packages/dashboard-v2/src/components/Icons/index.js b/packages/dashboard-v2/src/components/Icons/index.js
index e2af85e9..0bb96694 100644
--- a/packages/dashboard-v2/src/components/Icons/index.js
+++ b/packages/dashboard-v2/src/components/Icons/index.js
@@ -14,3 +14,4 @@ export * from "./icons/CopyIcon";
export * from "./icons/ShareIcon";
export * from "./icons/SimpleUploadIcon";
export * from "./icons/TrashIcon";
+export * from "./icons/ImportantNoteIcon";
diff --git a/packages/dashboard-v2/src/components/Modal/Modal.js b/packages/dashboard-v2/src/components/Modal/Modal.js
new file mode 100644
index 00000000..c183e190
--- /dev/null
+++ b/packages/dashboard-v2/src/components/Modal/Modal.js
@@ -0,0 +1,37 @@
+import cn from "classnames";
+import PropTypes from "prop-types";
+
+import { PlusIcon } from "../Icons";
+import { Panel } from "../Panel";
+
+import { ModalPortal } from "./ModalPortal";
+import { Overlay } from "./Overlay";
+
+export const Modal = ({ children, className, onClose }) => (
+
+
+
+
+
+);
+
+Modal.propTypes = {
+ /**
+ * Modal's body.
+ */
+ children: PropTypes.node.isRequired,
+ /**
+ * Handler function to be called when user clicks on the "X" icon,
+ * or outside of the modal.
+ */
+ onClose: PropTypes.func.isRequired,
+ /**
+ * Additional CSS classes to be applied to modal's body.
+ */
+ className: PropTypes.string,
+};
diff --git a/packages/dashboard-v2/src/components/Modal/ModalPortal.js b/packages/dashboard-v2/src/components/Modal/ModalPortal.js
new file mode 100644
index 00000000..ef18e612
--- /dev/null
+++ b/packages/dashboard-v2/src/components/Modal/ModalPortal.js
@@ -0,0 +1,16 @@
+import { useEffect, useRef, useState } from "react";
+import { createPortal } from "react-dom";
+
+export const MODAL_ROOT_ID = "__modal-root";
+
+export const ModalPortal = ({ children }) => {
+ const ref = useRef();
+ const [isClientSide, setIsClientSide] = useState(false);
+
+ useEffect(() => {
+ ref.current = document.querySelector(MODAL_ROOT_ID) || document.body;
+ setIsClientSide(true);
+ }, []);
+
+ return isClientSide ? createPortal(children, ref.current) : null;
+};
diff --git a/packages/dashboard-v2/src/components/Modal/Overlay.js b/packages/dashboard-v2/src/components/Modal/Overlay.js
new file mode 100644
index 00000000..7f1cbb35
--- /dev/null
+++ b/packages/dashboard-v2/src/components/Modal/Overlay.js
@@ -0,0 +1,42 @@
+import { useRef } from "react";
+import { useLockBodyScroll } from "react-use";
+import PropTypes from "prop-types";
+
+export const Overlay = ({ children, onClick }) => {
+ const overlayRef = useRef(null);
+
+ useLockBodyScroll(true);
+
+ const handleClick = (event) => {
+ if (event.target !== overlayRef.current) {
+ return;
+ }
+
+ event.nativeEvent.stopImmediatePropagation();
+
+ onClick?.(event);
+ };
+
+ return (
+
+ {children}
+
+ );
+};
+
+Overlay.propTypes = {
+ /**
+ * Overlay's body.
+ */
+ children: PropTypes.node.isRequired,
+ /**
+ * Handler function to be called when user clicks on the overlay
+ * (but not the overlay's content).
+ */
+ onClick: PropTypes.func,
+};
diff --git a/packages/dashboard-v2/src/components/Modal/index.js b/packages/dashboard-v2/src/components/Modal/index.js
new file mode 100644
index 00000000..00ce01f6
--- /dev/null
+++ b/packages/dashboard-v2/src/components/Modal/index.js
@@ -0,0 +1,2 @@
+export * from "./ModalPortal";
+export * from "./Modal";
diff --git a/packages/dashboard-v2/src/components/NavBar/NavBar.js b/packages/dashboard-v2/src/components/NavBar/NavBar.js
index 1db72dda..65d9afe5 100644
--- a/packages/dashboard-v2/src/components/NavBar/NavBar.js
+++ b/packages/dashboard-v2/src/components/NavBar/NavBar.js
@@ -1,4 +1,4 @@
-import { Link } from "gatsby";
+import { Link, navigate } from "gatsby";
import styled from "styled-components";
import { screen } from "../../lib/cssHelpers";
@@ -7,6 +7,7 @@ import { CogIcon, LockClosedIcon, SkynetLogoIcon } from "../Icons";
import { PageContainer } from "../PageContainer";
import { NavBarLink, NavBarSection } from ".";
+import accountsService from "../../services/accountsService";
const NavBarContainer = styled.div.attrs({
className: `grid sticky top-0 bg-white z-10 shadow-sm`,
@@ -77,9 +78,13 @@ export const NavBar = () => (
partiallyActive
/>
{
+ await accountsService.post("logout");
+ navigate("/auth/login");
+ // TODO: handle errors
+ }}
activeClassName="text-primary"
+ className="cursor-pointer"
icon={LockClosedIcon}
label="Log out"
/>
diff --git a/packages/dashboard-v2/src/components/Tooltip/Tooltip.js b/packages/dashboard-v2/src/components/Tooltip/Tooltip.js
new file mode 100644
index 00000000..d7bfde39
--- /dev/null
+++ b/packages/dashboard-v2/src/components/Tooltip/Tooltip.js
@@ -0,0 +1,29 @@
+import React, { useState } from "react";
+import styled, { keyframes } from "styled-components";
+
+const fadeIn = keyframes`
+ 0% { opacity: 0; }
+ 100% { opacity: 1; }
+`;
+
+const Popper = styled.div.attrs({
+ className: `absolute left-full top-1/2 z-10 px-2 py-1 text-xs
+ bg-black/90 text-white rounded`,
+})`
+ transform: translateY(-50%);
+ animation: ${fadeIn} 0.2s ease-in-out;
+`;
+
+export const Tooltip = ({ message, children, className }) => {
+ const [visible, setVisible] = useState(false);
+
+ const show = () => setVisible(true);
+ const hide = () => setVisible(false);
+
+ return (
+
+ {children}
+ {visible && {message} }
+
+ );
+};
diff --git a/packages/dashboard-v2/src/components/forms/AccountRemovalForm.js b/packages/dashboard-v2/src/components/forms/AccountRemovalForm.js
new file mode 100644
index 00000000..bdd7196e
--- /dev/null
+++ b/packages/dashboard-v2/src/components/forms/AccountRemovalForm.js
@@ -0,0 +1,78 @@
+import * as Yup from "yup";
+import { useState } from "react";
+import PropTypes from "prop-types";
+import { Formik, Form } from "formik";
+
+import { Button } from "../Button";
+import { TextField } from "../Form/TextField";
+import accountsService from "../../services/accountsService";
+
+const accountRemovalSchema = Yup.object().shape({
+ confirm: Yup.string().oneOf(["delete"], `Type "delete" to confirm`),
+});
+
+export const AccountRemovalForm = ({ abort, onSuccess }) => {
+ const [error, setError] = useState(false);
+
+ return (
+ {
+ try {
+ setError(false);
+ await accountsService.delete("user");
+ onSuccess();
+ } catch {
+ setError(true);
+ }
+ }}
+ >
+ {({ errors, touched, isValid, dirty }) => (
+
+ )}
+
+ );
+};
+
+AccountRemovalForm.propTypes = {
+ abort: PropTypes.func.isRequired,
+ onSuccess: PropTypes.func.isRequired,
+};
diff --git a/packages/dashboard-v2/src/components/forms/AccountSettingsForm.js b/packages/dashboard-v2/src/components/forms/AccountSettingsForm.js
new file mode 100644
index 00000000..2c382c1b
--- /dev/null
+++ b/packages/dashboard-v2/src/components/forms/AccountSettingsForm.js
@@ -0,0 +1,111 @@
+import * as Yup from "yup";
+import PropTypes from "prop-types";
+import { Formik, Form } from "formik";
+
+import { Button } from "../Button";
+import { TextField } from "../Form/TextField";
+import accountsService from "../../services/accountsService";
+
+const isPopulated = (value) => value?.length > 0;
+
+const emailUpdateSchema = Yup.object().shape({
+ email: Yup.string().email("Please provide a valid email address"),
+ confirmEmail: Yup.string()
+ .oneOf([Yup.ref("email"), null], "Emails must match")
+ .when("email", {
+ is: isPopulated,
+ then: (schema) => schema.required("Please confirm new email address"),
+ }),
+ password: Yup.string().min(1, "Password can't be blank"),
+ confirmPassword: Yup.string()
+ .oneOf([Yup.ref("password"), null], "Passwords must match")
+ .when("password", {
+ is: isPopulated,
+ then: (schema) => schema.required("Please confirm new password"),
+ }),
+});
+
+export const AccountSettingsForm = ({ user, onSuccess, onFailure }) => {
+ return (
+ {
+ try {
+ const user = await accountsService
+ .put("user", {
+ json: {
+ email: email || undefined,
+ password: password || undefined,
+ },
+ })
+ .json();
+
+ resetForm();
+ await onSuccess(user);
+ } catch {
+ onFailure();
+ }
+ }}
+ >
+ {({ errors, touched, isValid, dirty }) => (
+
+ )}
+
+ );
+};
+
+AccountSettingsForm.propTypes = {
+ onSuccess: PropTypes.func.isRequired,
+ onFailure: PropTypes.func.isRequired,
+};
diff --git a/packages/dashboard-v2/src/components/forms/AddAPIKeyForm.js b/packages/dashboard-v2/src/components/forms/AddAPIKeyForm.js
new file mode 100644
index 00000000..703d88a0
--- /dev/null
+++ b/packages/dashboard-v2/src/components/forms/AddAPIKeyForm.js
@@ -0,0 +1,114 @@
+import * as Yup from "yup";
+import { forwardRef, useImperativeHandle, useState } from "react";
+import PropTypes from "prop-types";
+import { Formik, Form } from "formik";
+
+import accountsService from "../../services/accountsService";
+
+import { Alert } from "../Alert";
+import { Button } from "../Button";
+import { CopyButton } from "../CopyButton";
+import { TextField } from "../Form/TextField";
+import { CircledProgressIcon, PlusIcon } from "../Icons";
+
+const newAPIKeySchema = Yup.object().shape({
+ name: Yup.string(),
+});
+
+const State = {
+ Pure: "PURE",
+ Success: "SUCCESS",
+ Failure: "FAILURE",
+};
+
+export const APIKeyType = {
+ Public: "public",
+ General: "general",
+};
+
+export const AddAPIKeyForm = forwardRef(({ onSuccess, type }, ref) => {
+ const [state, setState] = useState(State.Pure);
+ const [generatedKey, setGeneratedKey] = useState(null);
+
+ useImperativeHandle(ref, () => ({
+ reset: () => setState(State.Pure),
+ }));
+
+ return (
+
+ {state === State.Success && (
+
+ Success!
+ Please copy your new API key below. We'll never show it again!
+
+
+ {generatedKey}
+
+
+
+
+ )}
+ {state === State.Failure && (
+
We were not able to generate a new key. Please try again later.
+ )}
+
{
+ try {
+ const { key } = await accountsService
+ .post("user/apikeys", {
+ json: {
+ name,
+ public: type === APIKeyType.Public ? "true" : "false",
+ skylinks: type === APIKeyType.Public ? [] : null,
+ },
+ })
+ .json();
+
+ resetForm();
+ setGeneratedKey(key);
+ setState(State.Success);
+ onSuccess();
+ } catch {
+ setState(State.Failure);
+ }
+ }}
+ >
+ {({ errors, touched, isSubmitting }) => (
+
+ )}
+
+
+ );
+});
+
+AddAPIKeyForm.displayName = "AddAPIKeyForm";
+
+AddAPIKeyForm.propTypes = {
+ onSuccess: PropTypes.func.isRequired,
+ type: PropTypes.oneOf([APIKeyType.Public, APIKeyType.General]).isRequired,
+};
diff --git a/packages/dashboard-v2/src/components/forms/AddPublicAPIKeyForm.js b/packages/dashboard-v2/src/components/forms/AddPublicAPIKeyForm.js
new file mode 100644
index 00000000..2184c513
--- /dev/null
+++ b/packages/dashboard-v2/src/components/forms/AddPublicAPIKeyForm.js
@@ -0,0 +1,198 @@
+import * as Yup from "yup";
+import { forwardRef, useImperativeHandle, useState } from "react";
+import PropTypes from "prop-types";
+import { Formik, Form, FieldArray } from "formik";
+import { parseSkylink } from "skynet-js";
+import cn from "classnames";
+
+import accountsService from "../../services/accountsService";
+
+import { Alert } from "../Alert";
+import { Button } from "../Button";
+import { CopyButton } from "../CopyButton";
+import { TextField } from "../Form/TextField";
+import { PlusIcon, TrashIcon } from "../Icons";
+
+const skylinkValidator = (optional) => (value) => {
+ if (!value) {
+ return optional;
+ }
+
+ try {
+ return parseSkylink(value) !== null;
+ } catch {
+ return false;
+ }
+};
+
+const newPublicAPIKeySchema = Yup.object().shape({
+ name: Yup.string(),
+ skylinks: Yup.array().of(Yup.string().test("skylink", "Provide a valid Skylink", skylinkValidator(false))),
+ nextSkylink: Yup.string().when("skylinks", {
+ is: (skylinks) => skylinks.length === 0,
+ then: (schema) => schema.test("skylink", "Provide a valid Skylink", skylinkValidator(true)),
+ otherwise: (schema) => schema.test("skylink", "Provide a valid Skylink", skylinkValidator(true)),
+ }),
+});
+
+const State = {
+ Pure: "PURE",
+ Success: "SUCCESS",
+ Failure: "FAILURE",
+};
+
+export const AddPublicAPIKeyForm = forwardRef(({ onSuccess }, ref) => {
+ const [state, setState] = useState(State.Pure);
+ const [generatedKey, setGeneratedKey] = useState(null);
+
+ useImperativeHandle(ref, () => ({
+ reset: () => setState(State.Pure),
+ }));
+
+ return (
+
+ {state === State.Success && (
+
+ Success!
+ Please copy your new API key below. We'll never show it again!
+
+
+ {generatedKey}
+
+
+
+
+ )}
+ {state === State.Failure && (
+
We were not able to generate a new key. Please try again later.
+ )}
+
{
+ try {
+ const { key } = await accountsService
+ .post("user/apikeys", {
+ json: {
+ name,
+ public: "true",
+ skylinks: [...skylinks, nextSkylink].filter(Boolean).map(parseSkylink),
+ },
+ })
+ .json();
+
+ resetForm();
+ setGeneratedKey(key);
+ setState(State.Success);
+ onSuccess();
+ } catch {
+ setState(State.Failure);
+ }
+ }}
+ >
+ {({ errors, touched, isSubmitting, values, isValid, setFieldValue, setFieldTouched }) => (
+
+ )}
+
+
+ );
+});
+
+AddPublicAPIKeyForm.displayName = "AddAPIKeyForm";
+
+AddPublicAPIKeyForm.propTypes = {
+ onSuccess: PropTypes.func.isRequired,
+};
diff --git a/packages/dashboard-v2/src/components/forms/AddSkylinkToAPIKeyForm.js b/packages/dashboard-v2/src/components/forms/AddSkylinkToAPIKeyForm.js
new file mode 100644
index 00000000..55f27a01
--- /dev/null
+++ b/packages/dashboard-v2/src/components/forms/AddSkylinkToAPIKeyForm.js
@@ -0,0 +1,63 @@
+import * as Yup from "yup";
+import PropTypes from "prop-types";
+import { Formik, Form } from "formik";
+import { parseSkylink } from "skynet-js";
+
+import { Button } from "../Button";
+import { TextField } from "../Form/TextField";
+import { CircledProgressIcon, PlusIcon } from "../Icons";
+
+const newSkylinkSchema = Yup.object().shape({
+ skylink: Yup.string()
+ .required("Skylink is required")
+ .test("skylink", "Provide a valid Skylink", (value) => {
+ try {
+ return parseSkylink(value) !== null;
+ } catch {
+ return false;
+ }
+ }),
+});
+
+export const AddSkylinkToAPIKeyForm = ({ addSkylink }) => (
+ {
+ if (await addSkylink(parseSkylink(skylink))) {
+ resetForm();
+ }
+ }}
+ >
+ {({ errors, touched, isSubmitting }) => (
+
+ )}
+
+);
+
+AddSkylinkToAPIKeyForm.propTypes = {
+ addSkylink: PropTypes.func.isRequired,
+};
diff --git a/packages/dashboard-v2/src/components/forms/LoginForm.js b/packages/dashboard-v2/src/components/forms/LoginForm.js
new file mode 100644
index 00000000..a5a1deeb
--- /dev/null
+++ b/packages/dashboard-v2/src/components/forms/LoginForm.js
@@ -0,0 +1,95 @@
+import { useState } from "react";
+import PropTypes from "prop-types";
+import { Formik, Form } from "formik";
+import { Link } from "gatsby";
+import * as Yup from "yup";
+
+import HighlightedLink from "../HighlightedLink";
+import { TextField } from "../Form/TextField";
+import { Button } from "../Button";
+
+import accountsService from "../../services/accountsService";
+
+const loginSchema = Yup.object().shape({
+ email: Yup.string().required("Email is required").email("Please provide a valid email address"),
+ password: Yup.string().required("Password is required"),
+});
+
+const INVALID_CREDENTIALS_ERRORS = ["password mismatch", "user not found"];
+
+export const LoginForm = ({ onSuccess }) => {
+ const [error, setError] = useState(null);
+
+ return (
+ {
+ try {
+ await accountsService.post("login", {
+ json: values,
+ });
+
+ onSuccess();
+ } catch (err) {
+ if (err.response) {
+ const data = await err.response.json();
+
+ if (INVALID_CREDENTIALS_ERRORS.includes(data.message)) {
+ setError("Invalid email address or password.");
+ } else {
+ setError(data.message);
+ }
+ } else {
+ setError("An error occured when logging you in. Please try again.");
+ }
+ }
+ }}
+ >
+ {({ errors, touched }) => (
+
+ )}
+
+ );
+};
+
+LoginForm.propTypes = {
+ onSuccess: PropTypes.func.isRequired,
+};
diff --git a/packages/dashboard-v2/src/components/forms/RecoveryForm.js b/packages/dashboard-v2/src/components/forms/RecoveryForm.js
new file mode 100644
index 00000000..50564b34
--- /dev/null
+++ b/packages/dashboard-v2/src/components/forms/RecoveryForm.js
@@ -0,0 +1,57 @@
+import PropTypes from "prop-types";
+import { Formik, Form } from "formik";
+import * as Yup from "yup";
+
+import { TextField } from "../Form/TextField";
+import { Button } from "../Button";
+
+import accountsService from "../../services/accountsService";
+
+const recoverySchema = Yup.object().shape({
+ email: Yup.string().required("Email is required").email("Please provide a valid email address"),
+});
+
+export const RecoveryForm = ({ onSuccess, onFailure }) => (
+ {
+ try {
+ await accountsService.post("user/recover/request", {
+ json: values,
+ });
+
+ onSuccess();
+ } catch {
+ onFailure();
+ }
+ }}
+ >
+ {({ errors, touched }) => (
+
+ )}
+
+);
+
+RecoveryForm.propTypes = {
+ onFailure: PropTypes.func.isRequired,
+ onSuccess: PropTypes.func.isRequired,
+};
diff --git a/packages/dashboard-v2/src/components/forms/ResetPasswordForm.js b/packages/dashboard-v2/src/components/forms/ResetPasswordForm.js
new file mode 100644
index 00000000..68e8480f
--- /dev/null
+++ b/packages/dashboard-v2/src/components/forms/ResetPasswordForm.js
@@ -0,0 +1,67 @@
+import PropTypes from "prop-types";
+import { Formik, Form } from "formik";
+
+import { TextField } from "../Form/TextField";
+import { Button } from "../Button";
+import { passwordSchema } from "./SignUpForm";
+
+import accountsService from "../../services/accountsService";
+
+export const ResetPasswordForm = ({ token, onSuccess, onFailure }) => (
+ {
+ try {
+ await accountsService.post("user/recover", {
+ json: {
+ token,
+ password,
+ confirmPassword,
+ },
+ });
+
+ onSuccess();
+ } catch {
+ onFailure();
+ }
+ }}
+ >
+ {({ errors, touched }) => (
+
+ )}
+
+);
+
+ResetPasswordForm.propTypes = {
+ token: PropTypes.string.isRequired,
+ onFailure: PropTypes.func.isRequired,
+ onSuccess: PropTypes.func.isRequired,
+};
diff --git a/packages/dashboard-v2/src/components/forms/SignUpForm.js b/packages/dashboard-v2/src/components/forms/SignUpForm.js
new file mode 100644
index 00000000..976c0c74
--- /dev/null
+++ b/packages/dashboard-v2/src/components/forms/SignUpForm.js
@@ -0,0 +1,109 @@
+import PropTypes from "prop-types";
+import { Formik, Form } from "formik";
+import * as Yup from "yup";
+
+import { TextField } from "../Form/TextField";
+import { Button } from "../Button";
+
+import accountsService from "../../services/accountsService";
+
+export const passwordSchema = Yup.object().shape({
+ password: Yup.string().required("Password is required"),
+ confirmPassword: Yup.string()
+ .oneOf([Yup.ref("password"), null], "Passwords must match")
+ .required("Please re-type your password"),
+});
+
+const registrationSchema = Yup.object()
+ .shape({
+ email: Yup.string().required("Email is required").email("Please provide a valid email address"),
+ })
+ .concat(passwordSchema);
+
+const USER_EXISTS_ERROR = "identity already belongs to an existing user";
+
+export const SignUpForm = ({ onSuccess, onFailure }) => (
+ {
+ try {
+ await accountsService.post("user", {
+ json: {
+ email,
+ password,
+ },
+ });
+
+ onSuccess();
+ } catch (err) {
+ let isFormErrorSet = false;
+
+ if (err.response) {
+ const data = await err.response.json();
+
+ // If it's a user error, let's capture it and handle within the form.
+ if (USER_EXISTS_ERROR === data.message) {
+ setErrors({ email: "This email address already in use." });
+ isFormErrorSet = true;
+ }
+ }
+
+ if (!isFormErrorSet) {
+ onFailure();
+ }
+ }
+ }}
+ >
+ {({ errors, touched }) => (
+
+ )}
+
+);
+
+SignUpForm.propTypes = {
+ onFailure: PropTypes.func.isRequired,
+ onSuccess: PropTypes.func.isRequired,
+};
diff --git a/packages/dashboard-v2/src/components/forms/index.js b/packages/dashboard-v2/src/components/forms/index.js
new file mode 100644
index 00000000..1cad6f41
--- /dev/null
+++ b/packages/dashboard-v2/src/components/forms/index.js
@@ -0,0 +1 @@
+export * from "./LoginForm";
diff --git a/packages/dashboard-v2/src/layouts/AuthLayout.js b/packages/dashboard-v2/src/layouts/AuthLayout.js
new file mode 100644
index 00000000..85604321
--- /dev/null
+++ b/packages/dashboard-v2/src/layouts/AuthLayout.js
@@ -0,0 +1,50 @@
+import * as React from "react";
+import styled from "styled-components";
+import { SWRConfig } from "swr";
+
+import { UserProvider } from "../contexts/user";
+import { guestsOnly, allUsers } from "../lib/swrConfig";
+
+const Layout = styled.div.attrs({
+ className: "min-h-screen w-screen bg-black flex",
+})`
+ background-image: url(/images/auth-bg.svg);
+ background-repeat: no-repeat;
+ background-position: center center;
+`;
+
+const SloganContainer = styled.div.attrs({
+ className: "hidden md:flex lg:w-7/12 grow justify-center items-center relative overflow-hidden",
+})``;
+
+const Content = styled.div.attrs({
+ className: "w-full md:w-5/12 md:max-w-[680px] shrink-0",
+})``;
+
+const AuthLayout =
+ (swrConfig) =>
+ ({ children }) => {
+ return (
+ <>
+
+
+
+
+
+
+ The decentralized revolution starts with decentralized storage
+
+
+
+ {children}
+
+
+
+ >
+ );
+ };
+
+// Some pages (e.g. email confirmation) need to be accessible to both logged-in and guest users.
+export const AllUsersAuthLayout = AuthLayout(allUsers);
+
+export default AuthLayout(guestsOnly);
diff --git a/packages/dashboard-v2/src/lib/swrConfig.js b/packages/dashboard-v2/src/lib/swrConfig.js
index 3e5f730a..058b5ead 100644
--- a/packages/dashboard-v2/src/lib/swrConfig.js
+++ b/packages/dashboard-v2/src/lib/swrConfig.js
@@ -23,6 +23,10 @@ const redirectAuthenticated = (key) =>
return response.json();
});
+export const allUsers = {
+ fetcher: (key) => fetch(`${baseUrl}/${key}`).then((response) => response.json()),
+};
+
export const authenticatedOnly = {
fetcher: redirectUnauthenticated,
};
diff --git a/packages/dashboard-v2/src/pages/auth/login.js b/packages/dashboard-v2/src/pages/auth/login.js
new file mode 100644
index 00000000..e3b5240b
--- /dev/null
+++ b/packages/dashboard-v2/src/pages/auth/login.js
@@ -0,0 +1,23 @@
+import { navigate } from "gatsby";
+
+import AuthLayout from "../../layouts/AuthLayout";
+
+import { LoginForm } from "../../components/forms";
+
+const LoginPage = ({ location }) => {
+ const query = new URLSearchParams(location.search);
+ const redirectTo = query.get("return_to");
+
+ return (
+
+
+
+
+
navigate(redirectTo || "/")} />
+
+ );
+};
+
+LoginPage.Layout = AuthLayout;
+
+export default LoginPage;
diff --git a/packages/dashboard-v2/src/pages/auth/reset-password.js b/packages/dashboard-v2/src/pages/auth/reset-password.js
new file mode 100644
index 00000000..8ecbfeaa
--- /dev/null
+++ b/packages/dashboard-v2/src/pages/auth/reset-password.js
@@ -0,0 +1,48 @@
+import { useState } from "react";
+
+import AuthLayout from "../../layouts/AuthLayout";
+
+import { RecoveryForm } from "../../components/forms/RecoveryForm";
+import HighlightedLink from "../../components/HighlightedLink";
+
+const State = {
+ Pure: "PURE",
+ Success: "SUCCESS",
+ Failure: "FAILURE",
+};
+
+const ResetPasswordPage = () => {
+ const [state, setState] = useState(State.Pure);
+
+ return (
+
+
+
+
+ {state !== State.Success && (
+
setState(State.Success)} onFailure={() => setState(State.Failure)} />
+ )}
+
+ {state === State.Success && (
+ Please check your inbox for further instructions.
+ )}
+
+ {state === State.Failure && (
+ Something went wrong, please try again later.
+ )}
+
+
+
+ Suddenly remembered your password? Sign in
+
+
+ Don't actually have an account? Create one!
+
+
+
+ );
+};
+
+ResetPasswordPage.Layout = AuthLayout;
+
+export default ResetPasswordPage;
diff --git a/packages/dashboard-v2/src/pages/auth/signup.js b/packages/dashboard-v2/src/pages/auth/signup.js
new file mode 100644
index 00000000..4acbae85
--- /dev/null
+++ b/packages/dashboard-v2/src/pages/auth/signup.js
@@ -0,0 +1,56 @@
+import { useEffect, useState } from "react";
+
+import AuthLayout from "../../layouts/AuthLayout";
+
+import HighlightedLink from "../../components/HighlightedLink";
+import { SignUpForm } from "../../components/forms/SignUpForm";
+import { navigate } from "gatsby";
+
+const State = {
+ Pure: "PURE",
+ Success: "SUCCESS",
+ Failure: "FAILURE",
+};
+
+const SignUpPage = () => {
+ const [state, setState] = useState(State.Pure);
+
+ useEffect(() => {
+ if (state === State.Success) {
+ const timer = setTimeout(() => navigate("/"), 3000);
+
+ return () => clearTimeout(timer);
+ }
+ }, [state]);
+
+ return (
+
+
+
+
+ {state !== State.Success && (
+
setState(State.Success)} onFailure={() => setState(State.Failure)} />
+ )}
+
+ {state === State.Success && (
+
+
Please check your inbox and confirm your email address.
+
You will be redirected to your dashboard shortly.
+
Click here to go there now.
+
+ )}
+
+ {state === State.Failure && (
+ Something went wrong, please try again later.
+ )}
+
+
+ Already have an account? Sign in
+
+
+ );
+};
+
+SignUpPage.Layout = AuthLayout;
+
+export default SignUpPage;
diff --git a/packages/dashboard-v2/src/pages/settings/api-keys.js b/packages/dashboard-v2/src/pages/settings/api-keys.js
index 8ed8b1c8..1f6c93c5 100644
--- a/packages/dashboard-v2/src/pages/settings/api-keys.js
+++ b/packages/dashboard-v2/src/pages/settings/api-keys.js
@@ -1,63 +1,100 @@
import useSWR from "swr";
-import dayjs from "dayjs";
+import { useCallback, useRef } from "react";
import UserSettingsLayout from "../../layouts/UserSettingsLayout";
-import { TextInputBasic } from "../../components/TextInputBasic";
-import { Button } from "../../components/Button";
-import { TrashIcon } from "../../components/Icons";
+import { AddAPIKeyForm, APIKeyType } from "../../components/forms/AddAPIKeyForm";
+import { APIKeyList } from "../../components/APIKeyList/APIKeyList";
+import { Alert } from "../../components/Alert";
+import { AddPublicAPIKeyForm } from "../../components/forms/AddPublicAPIKeyForm";
const APIKeysPage = () => {
- const { data: apiKeys } = useSWR("user/apikeys");
+ const { data: apiKeys = [], mutate: reloadKeys, error } = useSWR("user/apikeys");
+ const generalKeys = apiKeys.filter(({ public: isPublic }) => isPublic === "false");
+ const publicKeys = apiKeys.filter(({ public: isPublic }) => isPublic === "true");
+
+ const publicFormRef = useRef();
+ const generalFormRef = useRef();
+
+ const refreshState = useCallback(
+ (resetForms) => {
+ if (resetForms) {
+ publicFormRef.current?.reset();
+ generalFormRef.current?.reset();
+ }
+ reloadKeys();
+ },
+ [reloadKeys]
+ );
return (
<>
-
+
API Keys
-
- At vero eos et caritatem, quae sine metu contineret, saluti prospexit civium, qua. Laudem et dolorem
- aspernari ut ad naturam aut fu.
+
There are two types of API keys that you can generate for your account.
+
Make sure to use the appropriate type.
+
+
+
+
+
+ Public keys
+
+ Public keys provide read access to a selected list of skylinks. You can share them publicly.
+
+
+
+ {error ? (
+
+ An error occurred while loading your API keys. Please try again later.
+
+ ) : (
+
+ {publicKeys?.length > 0 ? (
+
refreshState(true)} />
+ ) : (
+ No public API keys found.
+ )}
+
+ )}
-
-
-
-
- console.info("TODO: generate ky")}>Generate
-
+
+
+ General keys
+
+ These keys provide full access to Accounts service and are equivalent to using a JWT token.
+
+
+ This type of API keys needs to be kept secret and should never be shared with anyone.
+
+
+
+
+ {error ? (
+
+ An error occurred while loading your API keys. Please try again later.
+
+ ) : (
+
+ {generalKeys?.length > 0 ? (
+
refreshState(true)} />
+ ) : (
+ No general API keys found.
+ )}
+
+ )}
- {apiKeys?.length > 0 && (
-
- API Keys
-
- {apiKeys.map(({ id, name, createdAt }) => (
-
- {name || id}
-
- {dayjs(createdAt).format("MMM DD, YYYY")}
-
- window.confirm("TODO: confirmation modal")}
- >
-
-
-
-
- ))}
-
-
- )}
-
-
+
+
>
diff --git a/packages/dashboard-v2/src/pages/settings/index.js b/packages/dashboard-v2/src/pages/settings/index.js
index 459cf8c0..358a4b28 100644
--- a/packages/dashboard-v2/src/pages/settings/index.js
+++ b/packages/dashboard-v2/src/pages/settings/index.js
@@ -1,19 +1,42 @@
-import * as React from "react";
-import { useMedia } from "react-use";
-import styled from "styled-components";
+import { useCallback, useState } from "react";
+import { navigate } from "gatsby";
-import theme from "../../lib/theme";
+import { useUser } from "../../contexts/user";
import UserSettingsLayout from "../../layouts/UserSettingsLayout";
-import { TextInputBasic } from "../../components/TextInputBasic/TextInputBasic";
-import { Button } from "../../components/Button";
-import { AvatarUploader } from "../../components/AvatarUploader";
+import { AccountSettingsForm } from "../../components/forms/AccountSettingsForm";
+import { Modal } from "../../components/Modal/Modal";
+import { AccountRemovalForm } from "../../components/forms/AccountRemovalForm";
+import { Alert } from "../../components/Alert";
-const FormGroup = styled.div.attrs({
- className: "grid sm:grid-cols-[1fr_min-content] w-full gap-y-2 gap-x-4 items-end",
-})``;
+const State = {
+ Pure: "PURE",
+ Success: "SUCCESS",
+ Failure: "FAILURE",
+};
const AccountPage = () => {
- const isLargeScreen = useMedia(`(min-width: ${theme.screens.xl})`);
+ const { user, mutate: reloadUser } = useUser();
+ const [state, setState] = useState(State.Pure);
+ const [removalInitiated, setRemovalInitiated] = useState(false);
+
+ const prompt = () => setRemovalInitiated(true);
+ const abort = () => setRemovalInitiated(false);
+
+ const onSettingsUpdated = useCallback(
+ async (updatedState) => {
+ try {
+ // Update state locally and request revalidation.
+ await reloadUser(updatedState);
+ } finally {
+ // If revalidation fails, we can't really do much. Request
+ // will be auto-retried by SWR, so we'll just show a message
+ // about the update request being successful.
+ setState(State.Success);
+ }
+ },
+ [reloadUser]
+ );
+
return (
<>
@@ -26,34 +49,12 @@ const AccountPage = () => {
- {!isLargeScreen && (
-
- )}
-
-
-
- Update
-
-
-
-
-
- Update
-
-
-
-
-
- Update
-
-
- The password must be at least 6 characters long. Significantly different from the email and old
- password.
-
-
+ {state === State.Failure && (
+ There was an error processing your request. Please try again later.
+ )}
+ {state === State.Success && Changes saved successfully. }
+ setState(State.Failure)} />
@@ -61,16 +62,18 @@ const AccountPage = () => {
This will completely delete your account. This process can't be undone.
window.confirm("TODO: confirmation modal")}
+ onClick={prompt}
className="text-error underline decoration-1 hover:decoration-dashed"
>
Delete account
-
+ {removalInitiated && (
+
+ navigate("/auth/login")} />
+
+ )}
>
);
diff --git a/packages/dashboard-v2/src/pages/user/confirm.js b/packages/dashboard-v2/src/pages/user/confirm.js
new file mode 100644
index 00000000..9e95e3e3
--- /dev/null
+++ b/packages/dashboard-v2/src/pages/user/confirm.js
@@ -0,0 +1,78 @@
+import { useEffect, useState } from "react";
+import { navigate } from "gatsby";
+
+import { AllUsersAuthLayout } from "../../layouts/AuthLayout";
+
+import HighlightedLink from "../../components/HighlightedLink";
+import accountsService from "../../services/accountsService";
+
+const State = {
+ Pure: "PURE",
+ Success: "SUCCESS",
+ Failure: "FAILURE",
+};
+
+const EmailConfirmationPage = ({ location }) => {
+ const query = new URLSearchParams(location.search);
+ const token = query.get("token");
+
+ const [state, setState] = useState(State.Pure);
+
+ useEffect(() => {
+ const controller = new AbortController();
+ let timer;
+
+ async function confirm(token) {
+ try {
+ await accountsService.get("user/confirm", {
+ signal: controller.signal,
+ searchParams: { token },
+ });
+
+ timer = setTimeout(() => {
+ navigate("/");
+ }, 3000);
+ setState(State.Success);
+ } catch (err) {
+ // Don't show an error message if request was aborted due to `token` changing.
+ if (err.code !== DOMException.ABORT_ERR) {
+ setState(State.Failure);
+ }
+ }
+ }
+
+ if (token) {
+ confirm(token);
+ }
+
+ return () => {
+ controller.abort();
+ clearTimeout(timer);
+ };
+ }, [token]);
+
+ return (
+
+
+
+
+
+ {state === State.Pure &&
Please wait while we verify your account...
}
+
+ {state === State.Success && (
+ <>
+
All done!
+
You will be redirected to your dashboard shortly.
+
Redirect now.
+ >
+ )}
+
+ {state === State.Failure &&
Something went wrong, please try again later.
}
+
+
+ );
+};
+
+EmailConfirmationPage.Layout = AllUsersAuthLayout;
+
+export default EmailConfirmationPage;
diff --git a/packages/dashboard-v2/src/pages/user/recover.js b/packages/dashboard-v2/src/pages/user/recover.js
new file mode 100644
index 00000000..686e677a
--- /dev/null
+++ b/packages/dashboard-v2/src/pages/user/recover.js
@@ -0,0 +1,56 @@
+import { useState } from "react";
+import { navigate } from "gatsby";
+
+import AuthLayout from "../../layouts/AuthLayout";
+
+import { ResetPasswordForm } from "../../components/forms/ResetPasswordForm";
+import HighlightedLink from "../../components/HighlightedLink";
+
+const State = {
+ Pure: "PURE",
+ Success: "SUCCESS",
+ Failure: "FAILURE",
+};
+
+const RecoverPage = ({ location }) => {
+ const query = new URLSearchParams(location.search);
+ const token = query.get("token");
+
+ const [state, setState] = useState(State.Pure);
+
+ return (
+
+
+
+
+ {state !== State.Success && (
+
{
+ setState(State.Success);
+ navigate("/");
+ }}
+ onFailure={() => setState(State.Failure)}
+ />
+ )}
+
+ {state === State.Success && (
+
+ All done! You will be redirected to your dashboard shortly.
+
+ )}
+
+ {state === State.Failure && (
+ Something went wrong, please try again later.
+ )}
+
+
+ Suddenly remembered your old password? Sign in
+
+
+ );
+};
+
+RecoverPage.Layout = AuthLayout;
+
+export default RecoverPage;
diff --git a/packages/dashboard-v2/src/services/accountsService.js b/packages/dashboard-v2/src/services/accountsService.js
new file mode 100644
index 00000000..37244e5f
--- /dev/null
+++ b/packages/dashboard-v2/src/services/accountsService.js
@@ -0,0 +1,3 @@
+import ky from "ky";
+
+export default ky.create({ prefixUrl: "/api" });
diff --git a/packages/dashboard-v2/static/images/api-keys.svg b/packages/dashboard-v2/static/images/api-keys.svg
new file mode 100644
index 00000000..35fe3744
--- /dev/null
+++ b/packages/dashboard-v2/static/images/api-keys.svg
@@ -0,0 +1 @@
+
diff --git a/packages/dashboard-v2/static/images/auth-bg.svg b/packages/dashboard-v2/static/images/auth-bg.svg
new file mode 100644
index 00000000..89d598f8
--- /dev/null
+++ b/packages/dashboard-v2/static/images/auth-bg.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/dashboard-v2/static/images/logo-black-text.svg b/packages/dashboard-v2/static/images/logo-black-text.svg
new file mode 100644
index 00000000..40e45ba8
--- /dev/null
+++ b/packages/dashboard-v2/static/images/logo-black-text.svg
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/dashboard-v2/tailwind.config.js b/packages/dashboard-v2/tailwind.config.js
index 076d6912..636cd40e 100644
--- a/packages/dashboard-v2/tailwind.config.js
+++ b/packages/dashboard-v2/tailwind.config.js
@@ -54,6 +54,7 @@ module.exports = {
wiggle: "wiggle 3s ease-in-out infinite",
},
width: {
+ modal: "500px",
page: "100%",
"page-md": "640px",
"page-lg": "896px",
@@ -64,6 +65,9 @@ module.exports = {
minWidth: {
button: "112px",
},
+ maxWidth: {
+ modal: "calc(100vw - 1rem)",
+ },
},
},
plugins: [
diff --git a/packages/dashboard-v2/yarn.lock b/packages/dashboard-v2/yarn.lock
index 12ff2eb1..52cf68b8 100644
--- a/packages/dashboard-v2/yarn.lock
+++ b/packages/dashboard-v2/yarn.lock
@@ -3373,6 +3373,11 @@
dependencies:
"@types/node" "*"
+"@types/lodash@^4.14.175":
+ version "4.14.180"
+ resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.180.tgz#4ab7c9ddfc92ec4a887886483bc14c79fb380670"
+ integrity sha512-XOKXa1KIxtNXgASAnwj7cnttJxS4fksBRywK/9LzRV5YxrF80BXZIGeQSuoESQ/VkUj30Ae0+YcuHc15wJCB2g==
+
"@types/lodash@^4.14.92":
version "4.14.178"
resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.178.tgz#341f6d2247db528d4a13ddbb374bcdc80406f4f8"
@@ -6366,6 +6371,11 @@ deep-object-diff@^1.1.0:
resolved "https://registry.yarnpkg.com/deep-object-diff/-/deep-object-diff-1.1.7.tgz#348b3246f426427dd633eaa50e1ed1fc2eafc7e4"
integrity sha512-QkgBca0mL08P6HiOjoqvmm6xOAl2W6CT2+34Ljhg0OeFan8cwlcdq8jrLKsBBuUFAZLsN5b6y491KdKEoSo9lg==
+deepmerge@^2.1.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-2.2.1.tgz#5d3ff22a01c00f645405a2fbc17d0778a1801170"
+ integrity sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==
+
deepmerge@^4.0.0, deepmerge@^4.2.2:
version "4.2.2"
resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955"
@@ -7951,6 +7961,19 @@ format@^0.2.0:
resolved "https://registry.yarnpkg.com/format/-/format-0.2.2.tgz#d6170107e9efdc4ed30c9dc39016df942b5cb58b"
integrity sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs=
+formik@^2.2.9:
+ version "2.2.9"
+ resolved "https://registry.yarnpkg.com/formik/-/formik-2.2.9.tgz#8594ba9c5e2e5cf1f42c5704128e119fc46232d0"
+ integrity sha512-LQLcISMmf1r5at4/gyJigGn0gOwFbeEAlji+N9InZF6LIMXnFNkO42sCI8Jt84YZggpD4cPWObAZaxpEFtSzNA==
+ dependencies:
+ deepmerge "^2.1.1"
+ hoist-non-react-statics "^3.3.0"
+ lodash "^4.17.21"
+ lodash-es "^4.17.21"
+ react-fast-compare "^2.0.1"
+ tiny-warning "^1.0.2"
+ tslib "^1.10.0"
+
forwarded@0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811"
@@ -10357,6 +10380,11 @@ klona@^2.0.4:
resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.5.tgz#d166574d90076395d9963aa7a928fabb8d76afbc"
integrity sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==
+ky@^0.30.0:
+ version "0.30.0"
+ resolved "https://registry.yarnpkg.com/ky/-/ky-0.30.0.tgz#a3d293e4f6c4604a9a4694eceb6ce30e73d27d64"
+ integrity sha512-X/u76z4JtDVq10u1JA5UQfatPxgPaVDMYTrgHyiTpGN2z4TMEJkIHsoSBBSg9SWZEIXTKsi9kHgiQ9o3Y/4yog==
+
language-subtag-registry@~0.3.2:
version "0.3.21"
resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz#04ac218bea46f04cb039084602c6da9e788dd45a"
@@ -10510,6 +10538,11 @@ lock@^1.1.0:
resolved "https://registry.yarnpkg.com/lock/-/lock-1.1.0.tgz#53157499d1653b136ca66451071fca615703fa55"
integrity sha1-UxV0mdFlOxNspmRRBx/KYVcD+lU=
+lodash-es@^4.17.21:
+ version "4.17.21"
+ resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee"
+ integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==
+
lodash.clonedeep@4.5.0:
version "4.5.0"
resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef"
@@ -11007,9 +11040,9 @@ minimatch@^3.0.2, minimatch@^3.0.4:
brace-expansion "^1.1.7"
minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5:
- version "1.2.5"
- resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
- integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
+ version "1.2.6"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44"
+ integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==
minipass-collect@^1.0.2:
version "1.0.2"
@@ -11183,6 +11216,11 @@ nano-css@^5.3.1:
stacktrace-js "^2.0.2"
stylis "^4.0.6"
+nanoclone@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/nanoclone/-/nanoclone-0.2.1.tgz#dd4090f8f1a110d26bb32c49ed2f5b9235209ed4"
+ integrity sha512-wynEP02LmIbLpcYw8uBKpcfF6dmg2vcpKqxeH5UcoKEYdExslsdUA4ugFauuaeYdTB76ez6gJW8XAZ6CgkXYxA==
+
nanoid@^3.1.23, nanoid@^3.2.0, nanoid@^3.3.1:
version "3.3.1"
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.1.tgz#6347a18cac88af88f58af0b3594b723d5e99bb35"
@@ -12647,6 +12685,11 @@ proper-lockfile@^4.1.2:
retry "^0.12.0"
signal-exit "^3.0.2"
+property-expr@^2.0.4:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/property-expr/-/property-expr-2.0.5.tgz#278bdb15308ae16af3e3b9640024524f4dc02cb4"
+ integrity sha512-IJUkICM5dP5znhCckHSv30Q4b5/JA5enCtkRHYaOVOAocnH/1BQEYTC5NMfT3AVl/iXKdr3aqQbQn9DxyWknwA==
+
property-information@^5.0.0, property-information@^5.3.0:
version "5.6.0"
resolved "https://registry.yarnpkg.com/property-information/-/property-information-5.6.0.tgz#61675545fb23002f245c6540ec46077d4da3ed69"
@@ -12942,6 +12985,11 @@ react-error-overlay@^6.0.9:
resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.10.tgz#0fe26db4fa85d9dbb8624729580e90e7159a59a6"
integrity sha512-mKR90fX7Pm5seCOfz8q9F+66VCc1PGsWSBxKbITjfKVQHMNF2zudxHnMdJiB1fRCb+XsbQV9sO9DCkgsMQgBIA==
+react-fast-compare@^2.0.1:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-2.0.4.tgz#e84b4d455b0fec113e0402c329352715196f81f9"
+ integrity sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw==
+
react-fast-compare@^3.0.1, react-fast-compare@^3.1.1, react-fast-compare@^3.2.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.0.tgz#641a9da81b6a6320f270e89724fb45a0b39e43bb"
@@ -14830,6 +14878,11 @@ timsort@^0.3.0:
resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4"
integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=
+tiny-warning@^1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754"
+ integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==
+
tinycolor2@^1.4.1:
version "1.4.2"
resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.4.2.tgz#3f6a4d1071ad07676d7fa472e1fac40a719d8803"
@@ -14929,6 +14982,11 @@ token-types@^4.1.1:
"@tokenizer/token" "^0.3.0"
ieee754 "^1.2.1"
+toposort@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/toposort/-/toposort-2.0.2.tgz#ae21768175d1559d48bef35420b2f4962f09c330"
+ integrity sha1-riF2gXXRVZ1IvvNUILL0li8JwzA=
+
tr46@~0.0.3:
version "0.0.3"
resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a"
@@ -16036,6 +16094,19 @@ yoga-layout-prebuilt@^1.10.0:
dependencies:
"@types/yoga-layout" "1.9.2"
+yup@^0.32.11:
+ version "0.32.11"
+ resolved "https://registry.yarnpkg.com/yup/-/yup-0.32.11.tgz#d67fb83eefa4698607982e63f7ca4c5ed3cf18c5"
+ integrity sha512-Z2Fe1bn+eLstG8DRR6FTavGD+MeAwyfmouhHsIUgaADz8jvFKbO/fXc2trJKZg+5EBjh4gGm3iU/t3onKlXHIg==
+ dependencies:
+ "@babel/runtime" "^7.15.4"
+ "@types/lodash" "^4.14.175"
+ lodash "^4.17.21"
+ lodash-es "^4.17.21"
+ nanoclone "^0.2.1"
+ property-expr "^2.0.4"
+ toposort "^2.0.2"
+
yurnalist@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/yurnalist/-/yurnalist-2.1.0.tgz#44cf7ea5a33a8fab4968cc8c2970489f93760902"
diff --git a/packages/dashboard/package.json b/packages/dashboard/package.json
index 6da74280..bf517f01 100644
--- a/packages/dashboard/package.json
+++ b/packages/dashboard/package.json
@@ -8,8 +8,8 @@
"start": "next start"
},
"dependencies": {
- "@fontsource/sora": "4.5.3",
- "@fontsource/source-sans-pro": "4.5.4",
+ "@fontsource/sora": "4.5.5",
+ "@fontsource/source-sans-pro": "4.5.6",
"@stripe/react-stripe-js": "1.7.0",
"@stripe/stripe-js": "1.25.0",
"classnames": "2.3.1",
@@ -20,14 +20,14 @@
"formik": "2.2.9",
"http-status-codes": "2.2.0",
"ky": "0.30.0",
- "next": "12.1.0",
+ "next": "12.1.1",
"normalize.css": "8.0.1",
"pretty-bytes": "6.0.0",
"react": "17.0.2",
"react-dom": "17.0.2",
"react-toastify": "8.2.0",
"skynet-js": "3.0.2",
- "stripe": "8.210.0",
+ "stripe": "8.212.0",
"swr": "1.2.2",
"yup": "0.32.11"
},
@@ -35,10 +35,10 @@
"@tailwindcss/forms": "0.5.0",
"@tailwindcss/typography": "0.5.2",
"autoprefixer": "10.4.4",
- "eslint": "8.11.0",
- "eslint-config-next": "12.1.0",
+ "eslint": "8.12.0",
+ "eslint-config-next": "12.1.1",
"postcss": "8.4.12",
- "prettier": "2.6.0",
+ "prettier": "2.6.1",
"tailwindcss": "3.0.23"
}
}
diff --git a/packages/dashboard/yarn.lock b/packages/dashboard/yarn.lock
index 3c4368cd..98664b3f 100644
--- a/packages/dashboard/yarn.lock
+++ b/packages/dashboard/yarn.lock
@@ -53,15 +53,15 @@
minimatch "^3.0.4"
strip-json-comments "^3.1.1"
-"@fontsource/sora@4.5.3":
- version "4.5.3"
- resolved "https://registry.yarnpkg.com/@fontsource/sora/-/sora-4.5.3.tgz#987c9b43acb00c9e3fa5377ebcedfd4ec9b760a7"
- integrity sha512-0ipYkroLonvChAyLajgIt6mImXMhvjrHwD5g7iX2ZR1eJ4hLDnwq6haW5pSeehe79lPjgp0BX6ZHivFIP0xR2g==
+"@fontsource/sora@4.5.5":
+ version "4.5.5"
+ resolved "https://registry.yarnpkg.com/@fontsource/sora/-/sora-4.5.5.tgz#25e8e0a11d0a2a861ccce23a94383448c5beaa50"
+ integrity sha512-SeePOM5pvXaa2a1c9VuGPJGmHNcFSUBzVxfHMuQ/FrVeiXvF3XXyPbt68N6QmHK2rAH844BN1Y5zImxqa5ok6g==
-"@fontsource/source-sans-pro@4.5.4":
- version "4.5.4"
- resolved "https://registry.yarnpkg.com/@fontsource/source-sans-pro/-/source-sans-pro-4.5.4.tgz#51510723ff40f446c7800f133e9ae604ae2f38d7"
- integrity sha512-+YYw6HRvH9wYE+U2Hvxyossg+MHPApAj7VIjEqaXenNeNQa4U3uPD0e7pc+1Gic3srCQATN15O3S9WSFLXTmwQ==
+"@fontsource/source-sans-pro@4.5.6":
+ version "4.5.6"
+ resolved "https://registry.yarnpkg.com/@fontsource/source-sans-pro/-/source-sans-pro-4.5.6.tgz#1c74aa0168f0ad851e7c69a5ff25914c7691b6cb"
+ integrity sha512-MPv0Ye2OmcRD4wQ/7lOkysQpXpWkDSqZ2QHdNNLj7CQVtG03BScLMYQXZbYNhNMbH518tdMFewqDSu+/ikAMTg==
"@humanwhocodes/config-array@^0.9.2":
version "0.9.2"
@@ -77,72 +77,77 @@
resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45"
integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==
-"@next/env@12.1.0":
- version "12.1.0"
- resolved "https://registry.yarnpkg.com/@next/env/-/env-12.1.0.tgz#73713399399b34aa5a01771fb73272b55b22c314"
- integrity sha512-nrIgY6t17FQ9xxwH3jj0a6EOiQ/WDHUos35Hghtr+SWN/ntHIQ7UpuvSi0vaLzZVHQWaDupKI+liO5vANcDeTQ==
+"@next/env@12.1.1":
+ version "12.1.1"
+ resolved "https://registry.yarnpkg.com/@next/env/-/env-12.1.1.tgz#8a927397697ee9d94852feb5fed57a813d299979"
+ integrity sha512-VmTRkfo/IXOQCATndjW3OjKb8zmAuB07eDdzO9XvuXZP87SyvnCYw3jrhUuFhOe/FVsKiloafa5LJfToUpvjUQ==
-"@next/eslint-plugin-next@12.1.0":
- version "12.1.0"
- resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-12.1.0.tgz#32586a11378b3ffa5a93ac40a3c44ad99d70e95a"
- integrity sha512-WFiyvSM2G5cQmh32t/SiQuJ+I2O+FHVlK/RFw5b1565O2kEM/36EXncjt88Pa+X5oSc+1SS+tWxowWJd1lqI+g==
+"@next/eslint-plugin-next@12.1.1":
+ version "12.1.1"
+ resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-12.1.1.tgz#e3e51503e9d7f987a0e080344648bc84ac1e8eb8"
+ integrity sha512-5hd1VFWZzECADhvA+OE+g0CnrRBFZbPm03HbiUtpk7XeluNn7xVxBU6XvNQA+YrQ7qe5jCK9q7R8MbI9R55Y/Q==
dependencies:
glob "7.1.7"
-"@next/swc-android-arm64@12.1.0":
- version "12.1.0"
- resolved "https://registry.yarnpkg.com/@next/swc-android-arm64/-/swc-android-arm64-12.1.0.tgz#865ba3a9afc204ff2bdeea49dd64d58705007a39"
- integrity sha512-/280MLdZe0W03stA69iL+v6I+J1ascrQ6FrXBlXGCsGzrfMaGr7fskMa0T5AhQIVQD4nA/46QQWxG//DYuFBcA==
+"@next/swc-android-arm-eabi@12.1.1":
+ version "12.1.1"
+ resolved "https://registry.yarnpkg.com/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-12.1.1.tgz#2b134efb6639a770db10688a93ce0d2a9362fc5e"
+ integrity sha512-phV9H6d1eK1oVC7nmKKcCXvgOWT4K7aLC/beyO6yvbFC4XtBLE21vPwVl7B4ybz5xjSa6TXoR3TMR6vkW6Mv+A==
-"@next/swc-darwin-arm64@12.1.0":
- version "12.1.0"
- resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.1.0.tgz#08e8b411b8accd095009ed12efbc2f1d4d547135"
- integrity sha512-R8vcXE2/iONJ1Unf5Ptqjk6LRW3bggH+8drNkkzH4FLEQkHtELhvcmJwkXcuipyQCsIakldAXhRbZmm3YN1vXg==
+"@next/swc-android-arm64@12.1.1":
+ version "12.1.1"
+ resolved "https://registry.yarnpkg.com/@next/swc-android-arm64/-/swc-android-arm64-12.1.1.tgz#4fc66990c71c066f99fc435c0e8a4b3191bdfb4a"
+ integrity sha512-X5qEz0YeeYT0Gz2wXPAEtRKEuAsLUIEgC/DDfS98t/5Idjv0S4aqIX+TQdzoXP5bwQkIr+mSg+MBIdLtbtnCsA==
-"@next/swc-darwin-x64@12.1.0":
- version "12.1.0"
- resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-12.1.0.tgz#fcd684497a76e8feaca88db3c394480ff0b007cd"
- integrity sha512-ieAz0/J0PhmbZBB8+EA/JGdhRHBogF8BWaeqR7hwveb6SYEIJaDNQy0I+ZN8gF8hLj63bEDxJAs/cEhdnTq+ug==
+"@next/swc-darwin-arm64@12.1.1":
+ version "12.1.1"
+ resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.1.1.tgz#a5b4ea73ebf769f48dae97942b6b6fbeaf3f1dfc"
+ integrity sha512-bKKSNaTdnO3XPnfaR4NSpPcbs80fdbtOYC2lgtqLzA0bOMioupixMP5GrA/gfJHwh7GRH+A+sbgKQWsqSsYAqQ==
-"@next/swc-linux-arm-gnueabihf@12.1.0":
- version "12.1.0"
- resolved "https://registry.yarnpkg.com/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-12.1.0.tgz#9ec6380a27938a5799aaa6035c205b3c478468a7"
- integrity sha512-njUd9hpl6o6A5d08dC0cKAgXKCzm5fFtgGe6i0eko8IAdtAPbtHxtpre3VeSxdZvuGFh+hb0REySQP9T1ttkog==
+"@next/swc-darwin-x64@12.1.1":
+ version "12.1.1"
+ resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-12.1.1.tgz#064d50c08d9eec0fc1ff76e190d4fe43184aa8b7"
+ integrity sha512-2VOsA6WLDuDBA6935djohWGGeUIKeQhXwDwu1CKx1b8+6YMMIvFr/y2dpPWoct+5/IjFz84a2MnbABwpoNB9YA==
-"@next/swc-linux-arm64-gnu@12.1.0":
- version "12.1.0"
- resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-12.1.0.tgz#7f4196dff1049cea479607c75b81033ae2dbd093"
- integrity sha512-OqangJLkRxVxMhDtcb7Qn1xjzFA3s50EIxY7mljbSCLybU+sByPaWAHY4px97ieOlr2y4S0xdPKkQ3BCAwyo6Q==
+"@next/swc-linux-arm-gnueabihf@12.1.1":
+ version "12.1.1"
+ resolved "https://registry.yarnpkg.com/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-12.1.1.tgz#6cd6edda7f17ad1ceb1cd242419d93a643b1de31"
+ integrity sha512-1urXtWwqjqbbpJBWeJYz5ATgelKacVNdKIdhfahbsmW+DZGoK5TYovgieyHFYUCyHdTuKeLTVR62ahIRUBv1YA==
-"@next/swc-linux-arm64-musl@12.1.0":
- version "12.1.0"
- resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-12.1.0.tgz#b445f767569cdc2dddee785ca495e1a88c025566"
- integrity sha512-hB8cLSt4GdmOpcwRe2UzI5UWn6HHO/vLkr5OTuNvCJ5xGDwpPXelVkYW/0+C3g5axbDW2Tym4S+MQCkkH9QfWA==
+"@next/swc-linux-arm64-gnu@12.1.1":
+ version "12.1.1"
+ resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-12.1.1.tgz#d480c71de4150728c0c67a363c7f17291db3f070"
+ integrity sha512-CDD9yFuknDvTOzzDnvfmb58USI5Vu6FUyzw96udKj7KA/n1YrNQ4K8X7KsDCRZoqfRWYceAyj1EpwHkfdiB7bg==
-"@next/swc-linux-x64-gnu@12.1.0":
- version "12.1.0"
- resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.1.0.tgz#67610e9be4fbc987de7535f1bcb17e45fe12f90e"
- integrity sha512-OKO4R/digvrVuweSw/uBM4nSdyzsBV5EwkUeeG4KVpkIZEe64ZwRpnFB65bC6hGwxIBnTv5NMSnJ+0K/WmG78A==
+"@next/swc-linux-arm64-musl@12.1.1":
+ version "12.1.1"
+ resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-12.1.1.tgz#9578705269b746617c763c1ac5c5b26084f1e5ce"
+ integrity sha512-nxyjgmbOpZm7gGPj9EV5Cqosoujt+ih/8SO2XG+BetgfAk0+c15793DHVAljNuc8GF9wpzqQnjMMUZ211VmQsg==
-"@next/swc-linux-x64-musl@12.1.0":
- version "12.1.0"
- resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.1.0.tgz#ea19a23db08a9f2e34ac30401f774cf7d1669d31"
- integrity sha512-JohhgAHZvOD3rQY7tlp7NlmvtvYHBYgY0x5ZCecUT6eCCcl9lv6iV3nfu82ErkxNk1H893fqH0FUpznZ/H3pSw==
+"@next/swc-linux-x64-gnu@12.1.1":
+ version "12.1.1"
+ resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.1.1.tgz#40f3c79b65b6cfc880e6131a25f7936716ded1b9"
+ integrity sha512-L8Cu8kH3Vn2dnRpvcvGGA1TlmDP2WXJ+qDwvjb/ikDXLdRdmFvJwHh45JUGiW2FHed3lGseOgNsuYiDvnT8Cdw==
-"@next/swc-win32-arm64-msvc@12.1.0":
- version "12.1.0"
- resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-12.1.0.tgz#eadf054fc412085659b98e145435bbba200b5283"
- integrity sha512-T/3gIE6QEfKIJ4dmJk75v9hhNiYZhQYAoYm4iVo1TgcsuaKLFa+zMPh4056AHiG6n9tn2UQ1CFE8EoybEsqsSw==
+"@next/swc-linux-x64-musl@12.1.1":
+ version "12.1.1"
+ resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.1.1.tgz#922ea0306d36b5fd860d8cc5a6f4c53dca09395c"
+ integrity sha512-4RAb7L69MoRSggBqUfF3OrtBCUN2zPDi7asfL7bfxEhH10LGzyfil8dT0GVjPOPFz/SyLx3ORd6avGij2IlJUA==
-"@next/swc-win32-ia32-msvc@12.1.0":
- version "12.1.0"
- resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-12.1.0.tgz#68faeae10c89f698bf9d28759172b74c9c21bda1"
- integrity sha512-iwnKgHJdqhIW19H9PRPM9j55V6RdcOo6rX+5imx832BCWzkDbyomWnlzBfr6ByUYfhohb8QuH4hSGEikpPqI0Q==
+"@next/swc-win32-arm64-msvc@12.1.1":
+ version "12.1.1"
+ resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-12.1.1.tgz#be13af4e33c071e6ec97b2cfead51eb57ecf189b"
+ integrity sha512-zvkuNIgOxkAU3RbzWRGCcFasDxWJdhONt2YeRGe39dJERHhEFA1u4HgaZw/SFE/kfrNRUZbXjJNAg3OU/EpPZw==
-"@next/swc-win32-x64-msvc@12.1.0":
- version "12.1.0"
- resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.1.0.tgz#d27e7e76c87a460a4da99c5bfdb1618dcd6cd064"
- integrity sha512-aBvcbMwuanDH4EMrL2TthNJy+4nP59Bimn8egqv6GHMVj0a44cU6Au4PjOhLNqEh9l+IpRGBqMTzec94UdC5xg==
+"@next/swc-win32-ia32-msvc@12.1.1":
+ version "12.1.1"
+ resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-12.1.1.tgz#2a5adb993542fc54fedfd525c69593f75c055595"
+ integrity sha512-GsNDtZ//uKWNVjiwv3YKQYsDXuRWTz8jTmxopf5Ws3dK+zA77hn4o46LBQg0JPCNqTUO6eIOlUBjqSL6ejxmSQ==
+
+"@next/swc-win32-x64-msvc@12.1.1":
+ version "12.1.1"
+ resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.1.1.tgz#21c12feb6acf75cac7c1ae4ca7f251aa1943f081"
+ integrity sha512-nH5osn/uK9wsjT8Jh1YxMtRrkN5hoCNLQjsEdvfUfb+loQXeYiBd3n/0DUJkf6Scjfv6/htfUTPP3AEa7AbBxQ==
"@nodelib/fs.scandir@2.1.5":
version "2.1.5"
@@ -165,10 +170,10 @@
"@nodelib/fs.scandir" "2.1.5"
fastq "^1.6.0"
-"@rushstack/eslint-patch@^1.0.8":
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.1.0.tgz#7f698254aadf921e48dda8c0a6b304026b8a9323"
- integrity sha512-JLo+Y592QzIE+q7Dl2pMUtt4q8SKYI5jDrZxrozEQxnGVOyYE+GWK9eLkwTaeN9DDctlaRAQ3TBmzZ1qdLE30A==
+"@rushstack/eslint-patch@1.0.8":
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.0.8.tgz#be3e914e84eacf16dbebd311c0d0b44aa1174c64"
+ integrity sha512-ZK5v4bJwgXldAUA8r3q9YKfCwOqoHTK/ZqRjSeRXQrBXWouoPnS4MQtgC4AXGiiBuUu5wxrRgTlv0ktmM4P1Aw==
"@stripe/react-stripe-js@1.7.0":
version "1.7.0"
@@ -218,48 +223,48 @@
resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0"
integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==
-"@typescript-eslint/parser@^5.0.0":
- version "5.6.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.6.0.tgz#11677324659641400d653253c03dcfbed468d199"
- integrity sha512-YVK49NgdUPQ8SpCZaOpiq1kLkYRPMv9U5gcMrywzI8brtwZjr/tG3sZpuHyODt76W/A0SufNjYt9ZOgrC4tLIQ==
+"@typescript-eslint/parser@5.10.1":
+ version "5.10.1"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.10.1.tgz#4ce9633cc33fc70bc13786cb793c1a76fe5ad6bd"
+ integrity sha512-GReo3tjNBwR5RnRO0K2wDIDN31cM3MmDtgyQ85oAxAmC5K3j/g85IjP+cDfcqDsDDBf1HNKQAD0WqOYL8jXqUA==
dependencies:
- "@typescript-eslint/scope-manager" "5.6.0"
- "@typescript-eslint/types" "5.6.0"
- "@typescript-eslint/typescript-estree" "5.6.0"
+ "@typescript-eslint/scope-manager" "5.10.1"
+ "@typescript-eslint/types" "5.10.1"
+ "@typescript-eslint/typescript-estree" "5.10.1"
debug "^4.3.2"
-"@typescript-eslint/scope-manager@5.6.0":
- version "5.6.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.6.0.tgz#9dd7f007dc8f3a34cdff6f79f5eaab27ae05157e"
- integrity sha512-1U1G77Hw2jsGWVsO2w6eVCbOg0HZ5WxL/cozVSTfqnL/eB9muhb8THsP0G3w+BB5xAHv9KptwdfYFAUfzcIh4A==
+"@typescript-eslint/scope-manager@5.10.1":
+ version "5.10.1"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.10.1.tgz#f0539c73804d2423506db2475352a4dec36cd809"
+ integrity sha512-Lyvi559Gvpn94k7+ElXNMEnXu/iundV5uFmCUNnftbFrUbAJ1WBoaGgkbOBm07jVZa682oaBU37ao/NGGX4ZDg==
dependencies:
- "@typescript-eslint/types" "5.6.0"
- "@typescript-eslint/visitor-keys" "5.6.0"
+ "@typescript-eslint/types" "5.10.1"
+ "@typescript-eslint/visitor-keys" "5.10.1"
-"@typescript-eslint/types@5.6.0":
- version "5.6.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.6.0.tgz#745cb1b59daadcc1f32f7be95f0f68accf38afdd"
- integrity sha512-OIZffked7mXv4mXzWU5MgAEbCf9ecNJBKi+Si6/I9PpTaj+cf2x58h2oHW5/P/yTnPkKaayfjhLvx+crnl5ubA==
+"@typescript-eslint/types@5.10.1":
+ version "5.10.1"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.10.1.tgz#dca9bd4cb8c067fc85304a31f38ec4766ba2d1ea"
+ integrity sha512-ZvxQ2QMy49bIIBpTqFiOenucqUyjTQ0WNLhBM6X1fh1NNlYAC6Kxsx8bRTY3jdYsYg44a0Z/uEgQkohbR0H87Q==
-"@typescript-eslint/typescript-estree@5.6.0":
- version "5.6.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.6.0.tgz#dfbb19c9307fdd81bd9c650c67e8397821d7faf0"
- integrity sha512-92vK5tQaE81rK7fOmuWMrSQtK1IMonESR+RJR2Tlc7w4o0MeEdjgidY/uO2Gobh7z4Q1hhS94Cr7r021fMVEeA==
+"@typescript-eslint/typescript-estree@5.10.1":
+ version "5.10.1"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.10.1.tgz#b268e67be0553f8790ba3fe87113282977adda15"
+ integrity sha512-PwIGnH7jIueXv4opcwEbVGDATjGPO1dx9RkUl5LlHDSe+FXxPwFL5W/qYd5/NHr7f6lo/vvTrAzd0KlQtRusJQ==
dependencies:
- "@typescript-eslint/types" "5.6.0"
- "@typescript-eslint/visitor-keys" "5.6.0"
+ "@typescript-eslint/types" "5.10.1"
+ "@typescript-eslint/visitor-keys" "5.10.1"
debug "^4.3.2"
globby "^11.0.4"
is-glob "^4.0.3"
semver "^7.3.5"
tsutils "^3.21.0"
-"@typescript-eslint/visitor-keys@5.6.0":
- version "5.6.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.6.0.tgz#3e36509e103fe9713d8f035ac977235fd63cb6e6"
- integrity sha512-1p7hDp5cpRFUyE3+lvA74egs+RWSgumrBpzBCDzfTFv0aQ7lIeay80yU0hIxgAhwQ6PcasW35kaOCyDOv6O/Ng==
+"@typescript-eslint/visitor-keys@5.10.1":
+ version "5.10.1"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.10.1.tgz#29102de692f59d7d34ecc457ed59ab5fc558010b"
+ integrity sha512-NjQ0Xinhy9IL979tpoTRuLKxMc0zJC7QVSdeerXs2/QvOy2yRkzX5dRb10X5woNUdJgU8G3nYRDlI33sq1K4YQ==
dependencies:
- "@typescript-eslint/types" "5.6.0"
+ "@typescript-eslint/types" "5.10.1"
eslint-visitor-keys "^3.0.0"
acorn-jsx@^5.3.1:
@@ -638,7 +643,7 @@ debug@^3.2.7:
dependencies:
ms "^2.1.1"
-debug@^4.1.1, debug@^4.3.1, debug@^4.3.2:
+debug@^4.1.1, debug@^4.3.2:
version "4.3.3"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664"
integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==
@@ -781,22 +786,30 @@ escape-string-regexp@^4.0.0:
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
-eslint-config-next@12.1.0:
- version "12.1.0"
- resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-12.1.0.tgz#8ace680dc5207e6ab6c915f3989adec122f582e7"
- integrity sha512-tBhuUgoDITcdcM7xFvensi9I5WTI4dnvH4ETGRg1U8ZKpXrZsWQFdOKIDzR3RLP5HR3xXrLviaMM4c3zVoE/pA==
+eslint-config-next@12.1.1:
+ version "12.1.1"
+ resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-12.1.1.tgz#11f948c5f4959267c2157dff8f2c28d067e3e1d9"
+ integrity sha512-+Ql9F07Pafs+cDgy8Zp0F8FxCBq7ke02ZyC2/MMEiGAX+WlnuUCrboBDnfzmHJpAAkcBPjUthunu6LBnF9KWIQ==
dependencies:
- "@next/eslint-plugin-next" "12.1.0"
- "@rushstack/eslint-patch" "^1.0.8"
- "@typescript-eslint/parser" "^5.0.0"
- eslint-import-resolver-node "^0.3.4"
- eslint-import-resolver-typescript "^2.4.0"
- eslint-plugin-import "^2.25.2"
- eslint-plugin-jsx-a11y "^6.5.1"
- eslint-plugin-react "^7.27.0"
- eslint-plugin-react-hooks "^4.3.0"
+ "@next/eslint-plugin-next" "12.1.1"
+ "@rushstack/eslint-patch" "1.0.8"
+ "@typescript-eslint/parser" "5.10.1"
+ eslint-import-resolver-node "0.3.4"
+ eslint-import-resolver-typescript "2.4.0"
+ eslint-plugin-import "2.25.2"
+ eslint-plugin-jsx-a11y "6.5.1"
+ eslint-plugin-react "7.29.1"
+ eslint-plugin-react-hooks "4.3.0"
-eslint-import-resolver-node@^0.3.4, eslint-import-resolver-node@^0.3.6:
+eslint-import-resolver-node@0.3.4:
+ version "0.3.4"
+ resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz#85ffa81942c25012d8231096ddf679c03042c717"
+ integrity sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==
+ dependencies:
+ debug "^2.6.9"
+ resolve "^1.13.1"
+
+eslint-import-resolver-node@^0.3.6:
version "0.3.6"
resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz#4048b958395da89668252001dbd9eca6b83bacbd"
integrity sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==
@@ -804,46 +817,45 @@ eslint-import-resolver-node@^0.3.4, eslint-import-resolver-node@^0.3.6:
debug "^3.2.7"
resolve "^1.20.0"
-eslint-import-resolver-typescript@^2.4.0:
- version "2.5.0"
- resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-2.5.0.tgz#07661966b272d14ba97f597b51e1a588f9722f0a"
- integrity sha512-qZ6e5CFr+I7K4VVhQu3M/9xGv9/YmwsEXrsm3nimw8vWaVHRDrQRp26BgCypTxBp3vUp4o5aVEJRiy0F2DFddQ==
+eslint-import-resolver-typescript@2.4.0:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-2.4.0.tgz#ec1e7063ebe807f0362a7320543aaed6fe1100e1"
+ integrity sha512-useJKURidCcldRLCNKWemr1fFQL1SzB3G4a0li6lFGvlc5xGe1hY343bvG07cbpCzPuM/lK19FIJB3XGFSkplA==
dependencies:
- debug "^4.3.1"
- glob "^7.1.7"
+ debug "^4.1.1"
+ glob "^7.1.6"
is-glob "^4.0.1"
- resolve "^1.20.0"
+ resolve "^1.17.0"
tsconfig-paths "^3.9.0"
-eslint-module-utils@^2.7.1:
- version "2.7.1"
- resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.1.tgz#b435001c9f8dd4ab7f6d0efcae4b9696d4c24b7c"
- integrity sha512-fjoetBXQZq2tSTWZ9yWVl2KuFrTZZH3V+9iD1V1RfpDgxzJR+mPd/KZmMiA8gbPqdBzpNiEHOuT7IYEWxrH0zQ==
+eslint-module-utils@^2.7.0:
+ version "2.7.3"
+ resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz#ad7e3a10552fdd0642e1e55292781bd6e34876ee"
+ integrity sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==
dependencies:
debug "^3.2.7"
find-up "^2.1.0"
- pkg-dir "^2.0.0"
-eslint-plugin-import@^2.25.2:
- version "2.25.3"
- resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.25.3.tgz#a554b5f66e08fb4f6dc99221866e57cfff824766"
- integrity sha512-RzAVbby+72IB3iOEL8clzPLzL3wpDrlwjsTBAQXgyp5SeTqqY+0bFubwuo+y/HLhNZcXV4XqTBO4LGsfyHIDXg==
+eslint-plugin-import@2.25.2:
+ version "2.25.2"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.25.2.tgz#b3b9160efddb702fc1636659e71ba1d10adbe9e9"
+ integrity sha512-qCwQr9TYfoBHOFcVGKY9C9unq05uOxxdklmBXLVvcwo68y5Hta6/GzCZEMx2zQiu0woKNEER0LE7ZgaOfBU14g==
dependencies:
array-includes "^3.1.4"
array.prototype.flat "^1.2.5"
debug "^2.6.9"
doctrine "^2.1.0"
eslint-import-resolver-node "^0.3.6"
- eslint-module-utils "^2.7.1"
+ eslint-module-utils "^2.7.0"
has "^1.0.3"
- is-core-module "^2.8.0"
+ is-core-module "^2.7.0"
is-glob "^4.0.3"
minimatch "^3.0.4"
object.values "^1.1.5"
resolve "^1.20.0"
tsconfig-paths "^3.11.0"
-eslint-plugin-jsx-a11y@^6.5.1:
+eslint-plugin-jsx-a11y@6.5.1:
version "6.5.1"
resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.5.1.tgz#cdbf2df901040ca140b6ec14715c988889c2a6d8"
integrity sha512-sVCFKX9fllURnXT2JwLN5Qgo24Ug5NF6dxhkmxsMEUZhXRcGg+X3e1JbJ84YePQKBl5E0ZjAH5Q4rkdcGY99+g==
@@ -861,27 +873,27 @@ eslint-plugin-jsx-a11y@^6.5.1:
language-tags "^1.0.5"
minimatch "^3.0.4"
-eslint-plugin-react-hooks@^4.3.0:
+eslint-plugin-react-hooks@4.3.0:
version "4.3.0"
resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.3.0.tgz#318dbf312e06fab1c835a4abef00121751ac1172"
integrity sha512-XslZy0LnMn+84NEG9jSGR6eGqaZB3133L8xewQo3fQagbQuGt7a63gf+P1NGKZavEYEC3UXaWEAA/AqDkuN6xA==
-eslint-plugin-react@^7.27.0:
- version "7.27.1"
- resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.27.1.tgz#469202442506616f77a854d91babaae1ec174b45"
- integrity sha512-meyunDjMMYeWr/4EBLTV1op3iSG3mjT/pz5gti38UzfM4OPpNc2m0t2xvKCOMU5D6FSdd34BIMFOvQbW+i8GAA==
+eslint-plugin-react@7.29.1:
+ version "7.29.1"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.29.1.tgz#6c40bc83142bb63d132a1b3565e2ea655411f800"
+ integrity sha512-WtzRpHMhsOX05ZrkyaaqmLl2uXGqmYooCfBxftJKlkYdsltiufGgfU7uuoHwR2lBam2Kh/EIVID4aU9e3kbCMA==
dependencies:
array-includes "^3.1.4"
array.prototype.flatmap "^1.2.5"
doctrine "^2.1.0"
estraverse "^5.3.0"
jsx-ast-utils "^2.4.1 || ^3.0.0"
- minimatch "^3.0.4"
+ minimatch "^3.1.2"
object.entries "^1.1.5"
object.fromentries "^2.0.5"
object.hasown "^1.1.0"
object.values "^1.1.5"
- prop-types "^15.7.2"
+ prop-types "^15.8.1"
resolve "^2.0.0-next.3"
semver "^6.3.0"
string.prototype.matchall "^4.0.6"
@@ -911,10 +923,10 @@ eslint-visitor-keys@^3.0.0, eslint-visitor-keys@^3.3.0:
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826"
integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==
-eslint@8.11.0:
- version "8.11.0"
- resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.11.0.tgz#88b91cfba1356fc10bb9eb592958457dfe09fb37"
- integrity sha512-/KRpd9mIRg2raGxHRGwW9ZywYNAClZrHjdueHcrVDuO3a6bj83eoTirCCk0M0yPwOjWYKHwRVRid+xK4F/GHgA==
+eslint@8.12.0:
+ version "8.12.0"
+ resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.12.0.tgz#c7a5bd1cfa09079aae64c9076c07eada66a46e8e"
+ integrity sha512-it1oBL9alZg1S8UycLm5YDMAkIhtH6FtAzuZs6YvoGVldWjbS08BkAdb/ymP9LlAyq8koANu32U7Ib/w+UNh8Q==
dependencies:
"@eslint/eslintrc" "^1.2.1"
"@humanwhocodes/config-array" "^0.9.2"
@@ -1165,7 +1177,7 @@ glob@7.1.7:
once "^1.3.0"
path-is-absolute "^1.0.0"
-glob@^7.1.3, glob@^7.1.7:
+glob@^7.1.3, glob@^7.1.6:
version "7.2.0"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023"
integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==
@@ -1340,14 +1352,7 @@ is-core-module@^2.2.0:
dependencies:
has "^1.0.3"
-is-core-module@^2.8.0:
- version "2.8.0"
- resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.0.tgz#0321336c3d0925e497fd97f5d95cb114a5ccd548"
- integrity sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==
- dependencies:
- has "^1.0.3"
-
-is-core-module@^2.8.1:
+is-core-module@^2.7.0, is-core-module@^2.8.1:
version "2.8.1"
resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211"
integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==
@@ -1646,10 +1651,17 @@ minimatch@^3.0.4:
dependencies:
brace-expansion "^1.1.7"
+minimatch@^3.1.2:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
+ integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
+ dependencies:
+ brace-expansion "^1.1.7"
+
minimist@^1.1.1, minimist@^1.2.0:
- version "1.2.5"
- resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
- integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
+ version "1.2.6"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44"
+ integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==
ms@2.0.0:
version "2.0.0"
@@ -1681,28 +1693,29 @@ natural-compare@^1.4.0:
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
-next@12.1.0:
- version "12.1.0"
- resolved "https://registry.yarnpkg.com/next/-/next-12.1.0.tgz#c33d753b644be92fc58e06e5a214f143da61dd5d"
- integrity sha512-s885kWvnIlxsUFHq9UGyIyLiuD0G3BUC/xrH0CEnH5lHEWkwQcHOORgbDF0hbrW9vr/7am4ETfX4A7M6DjrE7Q==
+next@12.1.1:
+ version "12.1.1"
+ resolved "https://registry.yarnpkg.com/next/-/next-12.1.1.tgz#f5e73d3a204da0632484a56040c23a4796958bc6"
+ integrity sha512-IOfEIAgroMtsoYz6HXpDS+b5WB9WZ+MH266COXGlcpIiYSgUyJf9xV6vF+zY2RPvBJFT4fUW0EVdVnoOmTloDw==
dependencies:
- "@next/env" "12.1.0"
+ "@next/env" "12.1.1"
caniuse-lite "^1.0.30001283"
postcss "8.4.5"
- styled-jsx "5.0.0"
+ styled-jsx "5.0.1"
use-subscription "1.5.1"
optionalDependencies:
- "@next/swc-android-arm64" "12.1.0"
- "@next/swc-darwin-arm64" "12.1.0"
- "@next/swc-darwin-x64" "12.1.0"
- "@next/swc-linux-arm-gnueabihf" "12.1.0"
- "@next/swc-linux-arm64-gnu" "12.1.0"
- "@next/swc-linux-arm64-musl" "12.1.0"
- "@next/swc-linux-x64-gnu" "12.1.0"
- "@next/swc-linux-x64-musl" "12.1.0"
- "@next/swc-win32-arm64-msvc" "12.1.0"
- "@next/swc-win32-ia32-msvc" "12.1.0"
- "@next/swc-win32-x64-msvc" "12.1.0"
+ "@next/swc-android-arm-eabi" "12.1.1"
+ "@next/swc-android-arm64" "12.1.1"
+ "@next/swc-darwin-arm64" "12.1.1"
+ "@next/swc-darwin-x64" "12.1.1"
+ "@next/swc-linux-arm-gnueabihf" "12.1.1"
+ "@next/swc-linux-arm64-gnu" "12.1.1"
+ "@next/swc-linux-arm64-musl" "12.1.1"
+ "@next/swc-linux-x64-gnu" "12.1.1"
+ "@next/swc-linux-x64-musl" "12.1.1"
+ "@next/swc-win32-arm64-msvc" "12.1.1"
+ "@next/swc-win32-ia32-msvc" "12.1.1"
+ "@next/swc-win32-x64-msvc" "12.1.1"
node-releases@^2.0.2:
version "2.0.2"
@@ -1884,13 +1897,6 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3:
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972"
integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==
-pkg-dir@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b"
- integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=
- dependencies:
- find-up "^2.1.0"
-
postcss-js@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-4.0.0.tgz#31db79889531b80dc7bc9b0ad283e418dce0ac00"
@@ -1950,10 +1956,10 @@ prelude-ls@^1.2.1:
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==
-prettier@2.6.0:
- version "2.6.0"
- resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.6.0.tgz#12f8f504c4d8ddb76475f441337542fa799207d4"
- integrity sha512-m2FgJibYrBGGgQXNzfd0PuDGShJgRavjUoRCw1mZERIWVSXF0iLzLm+aOqTAbLnC3n6JzUhAA8uZnFVghHJ86A==
+prettier@2.6.1:
+ version "2.6.1"
+ resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.6.1.tgz#d472797e0d7461605c1609808e27b80c0f9cfe17"
+ integrity sha512-8UVbTBYGwN37Bs9LERmxCPjdvPxlEowx2urIL6urHzdb3SDq4B/Z6xLFCblrSnE4iKWcS6ziJ3aOYrc1kz/E2A==
pretty-bytes@6.0.0:
version "6.0.0"
@@ -1969,6 +1975,15 @@ prop-types@^15.7.2:
object-assign "^4.1.1"
react-is "^16.8.1"
+prop-types@^15.8.1:
+ version "15.8.1"
+ resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5"
+ integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==
+ dependencies:
+ loose-envify "^1.4.0"
+ object-assign "^4.1.1"
+ react-is "^16.13.1"
+
property-expr@^2.0.4:
version "2.0.4"
resolved "https://registry.yarnpkg.com/property-expr/-/property-expr-2.0.4.tgz#37b925478e58965031bb612ec5b3260f8241e910"
@@ -2022,7 +2037,7 @@ react-fast-compare@^2.0.1:
resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-2.0.4.tgz#e84b4d455b0fec113e0402c329352715196f81f9"
integrity sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw==
-react-is@^16.7.0, react-is@^16.8.1:
+react-is@^16.13.1, react-is@^16.7.0, react-is@^16.8.1:
version "16.13.1"
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
@@ -2082,7 +2097,7 @@ resolve-from@^5.0.0:
resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69"
integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==
-resolve@^1.20.0, resolve@^1.22.0:
+resolve@^1.13.1, resolve@^1.17.0, resolve@^1.20.0, resolve@^1.22.0:
version "1.22.0"
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198"
integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==
@@ -2250,18 +2265,18 @@ strip-json-comments@^3.1.0, strip-json-comments@^3.1.1:
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
-stripe@8.210.0:
- version "8.210.0"
- resolved "https://registry.yarnpkg.com/stripe/-/stripe-8.210.0.tgz#6e5ede9abd36406d39b89d9129df86fb33f43db3"
- integrity sha512-NDQNEInrr1avwSEDB7Phe7PYNejtU9EkhOBlPa90Aomc3WvSXgOuX8MpswQ1mTw+W/lGpePwVqMsUvrvhUjZfA==
+stripe@8.212.0:
+ version "8.212.0"
+ resolved "https://registry.yarnpkg.com/stripe/-/stripe-8.212.0.tgz#78dc8d2be770580be23a8e597641a9ace6fd1035"
+ integrity sha512-xQ2uPMRAmRyOiMZktw3hY8jZ8LFR9lEQRPEaQ5WcDcn51kMyn46GeikOikxiFTHEN8PeKRdwtpz4yNArAvu/Kg==
dependencies:
"@types/node" ">=8.1.0"
qs "^6.6.0"
-styled-jsx@5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.0.0.tgz#816b4b92e07b1786c6b7111821750e0ba4d26e77"
- integrity sha512-qUqsWoBquEdERe10EW8vLp3jT25s/ssG1/qX5gZ4wu15OZpmSMFI2v+fWlRhLfykA5rFtlJ1ME8A8pm/peV4WA==
+styled-jsx@5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.0.1.tgz#78fecbbad2bf95ce6cd981a08918ce4696f5fc80"
+ integrity sha512-+PIZ/6Uk40mphiQJJI1202b+/dYeTVd9ZnMPR80pgiWbjIwvN2zIp4r9et0BgqBuShh48I0gttPlAXA7WVvBxw==
supports-color@^5.3.0:
version "5.5.0"
diff --git a/packages/dnslink-api/package.json b/packages/dnslink-api/package.json
index ab02b904..4b913067 100644
--- a/packages/dnslink-api/package.json
+++ b/packages/dnslink-api/package.json
@@ -8,6 +8,6 @@
"is-valid-domain": "^0.1.6"
},
"devDependencies": {
- "prettier": "^2.6.0"
+ "prettier": "^2.6.1"
}
}
diff --git a/packages/dnslink-api/yarn.lock b/packages/dnslink-api/yarn.lock
index 00d942fe..56631f9e 100644
--- a/packages/dnslink-api/yarn.lock
+++ b/packages/dnslink-api/yarn.lock
@@ -265,10 +265,10 @@ path-to-regexp@0.1.7:
resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=
-prettier@^2.6.0:
- version "2.6.0"
- resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.6.0.tgz#12f8f504c4d8ddb76475f441337542fa799207d4"
- integrity sha512-m2FgJibYrBGGgQXNzfd0PuDGShJgRavjUoRCw1mZERIWVSXF0iLzLm+aOqTAbLnC3n6JzUhAA8uZnFVghHJ86A==
+prettier@^2.6.1:
+ version "2.6.1"
+ resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.6.1.tgz#d472797e0d7461605c1609808e27b80c0f9cfe17"
+ integrity sha512-8UVbTBYGwN37Bs9LERmxCPjdvPxlEowx2urIL6urHzdb3SDq4B/Z6xLFCblrSnE4iKWcS6ziJ3aOYrc1kz/E2A==
proxy-addr@~2.0.7:
version "2.0.7"
diff --git a/packages/handshake-api/package.json b/packages/handshake-api/package.json
index ca69fcf8..c102dd9d 100644
--- a/packages/handshake-api/package.json
+++ b/packages/handshake-api/package.json
@@ -10,6 +10,6 @@
"punycode": "^2.1.1"
},
"devDependencies": {
- "prettier": "^2.6.0"
+ "prettier": "^2.6.1"
}
}
diff --git a/packages/handshake-api/yarn.lock b/packages/handshake-api/yarn.lock
index 256c2c69..421cde2e 100644
--- a/packages/handshake-api/yarn.lock
+++ b/packages/handshake-api/yarn.lock
@@ -314,10 +314,10 @@ path-to-regexp@0.1.7:
resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=
-prettier@^2.6.0:
- version "2.6.0"
- resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.6.0.tgz#12f8f504c4d8ddb76475f441337542fa799207d4"
- integrity sha512-m2FgJibYrBGGgQXNzfd0PuDGShJgRavjUoRCw1mZERIWVSXF0iLzLm+aOqTAbLnC3n6JzUhAA8uZnFVghHJ86A==
+prettier@^2.6.1:
+ version "2.6.1"
+ resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.6.1.tgz#d472797e0d7461605c1609808e27b80c0f9cfe17"
+ integrity sha512-8UVbTBYGwN37Bs9LERmxCPjdvPxlEowx2urIL6urHzdb3SDq4B/Z6xLFCblrSnE4iKWcS6ziJ3aOYrc1kz/E2A==
proxy-addr@~2.0.7:
version "2.0.7"
diff --git a/packages/health-check/package.json b/packages/health-check/package.json
index fe12816e..fd512fc8 100644
--- a/packages/health-check/package.json
+++ b/packages/health-check/package.json
@@ -19,6 +19,6 @@
},
"devDependencies": {
"jest": "^27.5.1",
- "prettier": "^2.6.0"
+ "prettier": "^2.6.1"
}
}
diff --git a/packages/health-check/yarn.lock b/packages/health-check/yarn.lock
index 7f465dbd..5aae0c3d 100644
--- a/packages/health-check/yarn.lock
+++ b/packages/health-check/yarn.lock
@@ -2438,9 +2438,9 @@ minimatch@^3.0.4:
brace-expansion "^1.1.7"
minimist@^1.2.5:
- version "1.2.5"
- resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
- integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
+ version "1.2.6"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44"
+ integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==
ms@2.0.0:
version "2.0.0"
@@ -2643,10 +2643,10 @@ prelude-ls@~1.1.2:
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=
-prettier@^2.6.0:
- version "2.6.0"
- resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.6.0.tgz#12f8f504c4d8ddb76475f441337542fa799207d4"
- integrity sha512-m2FgJibYrBGGgQXNzfd0PuDGShJgRavjUoRCw1mZERIWVSXF0iLzLm+aOqTAbLnC3n6JzUhAA8uZnFVghHJ86A==
+prettier@^2.6.1:
+ version "2.6.1"
+ resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.6.1.tgz#d472797e0d7461605c1609808e27b80c0f9cfe17"
+ integrity sha512-8UVbTBYGwN37Bs9LERmxCPjdvPxlEowx2urIL6urHzdb3SDq4B/Z6xLFCblrSnE4iKWcS6ziJ3aOYrc1kz/E2A==
pretty-format@^27.5.1:
version "27.5.1"
diff --git a/packages/website/package.json b/packages/website/package.json
index 76737420..3605dd76 100644
--- a/packages/website/package.json
+++ b/packages/website/package.json
@@ -5,31 +5,31 @@
"version": "0.1.0",
"author": "Skynet Labs.",
"dependencies": {
- "@fontsource/sora": "4.5.3",
- "@fontsource/source-sans-pro": "4.5.4",
+ "@fontsource/sora": "4.5.5",
+ "@fontsource/source-sans-pro": "4.5.6",
"@svgr/webpack": "6.2.1",
"bytes": "3.1.2",
"classnames": "2.3.1",
"copy-text-to-clipboard": "3.0.1",
"crypto-browserify": "3.12.0",
"framer-motion": "6.2.8",
- "gatsby": "4.10.1",
+ "gatsby": "4.10.3",
"gatsby-background-image": "1.6.0",
- "gatsby-plugin-image": "2.10.0",
- "gatsby-plugin-manifest": "4.10.1",
+ "gatsby-plugin-image": "2.10.1",
+ "gatsby-plugin-manifest": "4.10.2",
"gatsby-plugin-postcss": "5.10.0",
"gatsby-plugin-react-helmet": "5.10.0",
"gatsby-plugin-robots-txt": "1.7.0",
- "gatsby-plugin-sharp": "4.10.1",
- "gatsby-plugin-sitemap": "5.10.1",
+ "gatsby-plugin-sharp": "4.10.2",
+ "gatsby-plugin-sitemap": "5.10.2",
"gatsby-plugin-svgr": "3.0.0-beta.0",
- "gatsby-source-filesystem": "4.10.0",
+ "gatsby-source-filesystem": "4.10.1",
"gatsby-transformer-sharp": "4.10.0",
"gatsby-transformer-yaml": "4.10.0",
"gbimage-bridge": "0.2.1",
"http-status-codes": "2.2.0",
"ms": "2.1.3",
- "nanoid": "3.3.1",
+ "nanoid": "3.3.2",
"normalize.css": "8.0.1",
"path-browserify": "1.0.1",
"polished": "4.1.4",
@@ -49,7 +49,7 @@
"autoprefixer": "10.4.4",
"cross-env": "7.0.3",
"cypress": "9.5.2",
- "prettier": "2.6.0",
+ "prettier": "2.6.1",
"tailwindcss": "3.0.23"
},
"keywords": [
diff --git a/packages/website/yarn.lock b/packages/website/yarn.lock
index 78db47fe..ef122f09 100644
--- a/packages/website/yarn.lock
+++ b/packages/website/yarn.lock
@@ -1098,15 +1098,15 @@
minimatch "^3.0.4"
strip-json-comments "^3.1.1"
-"@fontsource/sora@4.5.3":
- version "4.5.3"
- resolved "https://registry.yarnpkg.com/@fontsource/sora/-/sora-4.5.3.tgz#987c9b43acb00c9e3fa5377ebcedfd4ec9b760a7"
- integrity sha512-0ipYkroLonvChAyLajgIt6mImXMhvjrHwD5g7iX2ZR1eJ4hLDnwq6haW5pSeehe79lPjgp0BX6ZHivFIP0xR2g==
+"@fontsource/sora@4.5.5":
+ version "4.5.5"
+ resolved "https://registry.yarnpkg.com/@fontsource/sora/-/sora-4.5.5.tgz#25e8e0a11d0a2a861ccce23a94383448c5beaa50"
+ integrity sha512-SeePOM5pvXaa2a1c9VuGPJGmHNcFSUBzVxfHMuQ/FrVeiXvF3XXyPbt68N6QmHK2rAH844BN1Y5zImxqa5ok6g==
-"@fontsource/source-sans-pro@4.5.4":
- version "4.5.4"
- resolved "https://registry.yarnpkg.com/@fontsource/source-sans-pro/-/source-sans-pro-4.5.4.tgz#51510723ff40f446c7800f133e9ae604ae2f38d7"
- integrity sha512-+YYw6HRvH9wYE+U2Hvxyossg+MHPApAj7VIjEqaXenNeNQa4U3uPD0e7pc+1Gic3srCQATN15O3S9WSFLXTmwQ==
+"@fontsource/source-sans-pro@4.5.6":
+ version "4.5.6"
+ resolved "https://registry.yarnpkg.com/@fontsource/source-sans-pro/-/source-sans-pro-4.5.6.tgz#1c74aa0168f0ad851e7c69a5ff25914c7691b6cb"
+ integrity sha512-MPv0Ye2OmcRD4wQ/7lOkysQpXpWkDSqZ2QHdNNLj7CQVtG03BScLMYQXZbYNhNMbH518tdMFewqDSu+/ikAMTg==
"@gatsbyjs/parcel-namer-relative-to-cwd@0.0.2":
version "0.0.2"
@@ -2436,7 +2436,7 @@
resolved "https://registry.yarnpkg.com/@types/get-port/-/get-port-3.2.0.tgz#f9e0a11443cc21336470185eae3dfba4495d29bc"
integrity sha512-TiNg8R1kjDde5Pub9F9vCwZA/BNW9HeXP5b9j7Qucqncy/McfPZ6xze/EyBdXS5FhMIGN6Fx3vg75l5KHy3V1Q==
-"@types/glob@*", "@types/glob@^7.1.1":
+"@types/glob@*":
version "7.2.0"
resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb"
integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==
@@ -3339,23 +3339,23 @@ babel-plugin-polyfill-regenerator@^0.3.0:
dependencies:
"@babel/helper-define-polyfill-provider" "^0.3.1"
-babel-plugin-remove-graphql-queries@^4.10.0:
- version "4.10.0"
- resolved "https://registry.yarnpkg.com/babel-plugin-remove-graphql-queries/-/babel-plugin-remove-graphql-queries-4.10.0.tgz#882ec7e75627ffd844e5c4c6d7ae50afe87bc415"
- integrity sha512-vANJvjh03qC7o6O3huCKO+Jtmee9WPUJm4Nm+qn/ww+GOOQwz0Z0bSMeBhUkJbT/Y1b1JlysHoxTO3ZNH47EwA==
+babel-plugin-remove-graphql-queries@^4.10.1:
+ version "4.10.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-remove-graphql-queries/-/babel-plugin-remove-graphql-queries-4.10.1.tgz#09357b7afad1d1bf359d97701ba267bf968197f4"
+ integrity sha512-1Irx5lUoQtU56u1hMtrgipjlRsUF4Pz6WDCDNVyTuvcHqlKHQK6pna4igHrdoWhSSgEcbimlxSy6tTvP6bkplg==
dependencies:
"@babel/runtime" "^7.15.4"
- gatsby-core-utils "^3.10.0"
+ gatsby-core-utils "^3.10.1"
babel-plugin-transform-react-remove-prop-types@^0.4.24:
version "0.4.24"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz#f2edaf9b4c6a5fbe5c1d678bfb531078c1555f3a"
integrity sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==
-babel-preset-gatsby@^2.10.0:
- version "2.10.0"
- resolved "https://registry.yarnpkg.com/babel-preset-gatsby/-/babel-preset-gatsby-2.10.0.tgz#83695f47dfbb5e6ea2ce2b504f1e8716d39a5535"
- integrity sha512-rh8vXjNXzX8Hkt27R7L56EovUf1dZDQavaYiY8zMQno/0iK7XllgO18Cfkgg3yYro0u1jOBWpoderMmZBLaVgw==
+babel-preset-gatsby@^2.10.1:
+ version "2.10.1"
+ resolved "https://registry.yarnpkg.com/babel-preset-gatsby/-/babel-preset-gatsby-2.10.1.tgz#a31fe2f4b4ed64204baca5ea8267639a00dd1a6b"
+ integrity sha512-wuEP2Tsf7MnblXIqJDdg+DOUXZhWQHBQYH/6cQ+HdEFiXu0gwskj/s5sPI6KoBgGK23EIZGr94HBtCq0D3aNRQ==
dependencies:
"@babel/plugin-proposal-class-properties" "^7.14.0"
"@babel/plugin-proposal-nullish-coalescing-operator" "^7.14.5"
@@ -3370,7 +3370,7 @@ babel-preset-gatsby@^2.10.0:
babel-plugin-dynamic-import-node "^2.3.3"
babel-plugin-macros "^2.8.0"
babel-plugin-transform-react-remove-prop-types "^0.4.24"
- gatsby-core-utils "^3.10.0"
+ gatsby-core-utils "^3.10.1"
gatsby-legacy-polyfills "^2.10.0"
backo2@^1.0.2, backo2@~1.0.2:
@@ -4340,10 +4340,10 @@ create-ecdh@^4.0.0:
bn.js "^4.1.0"
elliptic "^6.5.3"
-create-gatsby@^2.10.1:
- version "2.10.1"
- resolved "https://registry.yarnpkg.com/create-gatsby/-/create-gatsby-2.10.1.tgz#7172877693efe02bebf7bd8c15a4072e83dfb916"
- integrity sha512-zkAtC6TLr6nNmZd2yKqnXuEMX2vX9ciu4VBtMY+4J/nQ/cV77xCAmoU9MCAjVDoLp2h8pNckYE1lneFxmhIgkQ==
+create-gatsby@^2.10.2:
+ version "2.10.2"
+ resolved "https://registry.yarnpkg.com/create-gatsby/-/create-gatsby-2.10.2.tgz#ded9eb4066078845529a02bc966ef414a77b814a"
+ integrity sha512-OmuFey3Eoaek20m8Br/iIqEr76AUrl/ThCn7TBYJ6RvWVKezKV5UksQlFpdQgPK8kO9LogjkmiyA0k94VC3nXg==
dependencies:
"@babel/runtime" "^7.15.4"
@@ -4808,20 +4808,6 @@ defined@^1.0.0:
resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693"
integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=
-del@^5.1.0:
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/del/-/del-5.1.0.tgz#d9487c94e367410e6eff2925ee58c0c84a75b3a7"
- integrity sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA==
- dependencies:
- globby "^10.0.1"
- graceful-fs "^4.2.2"
- is-glob "^4.0.1"
- is-path-cwd "^2.2.0"
- is-path-inside "^3.0.1"
- p-map "^3.0.0"
- rimraf "^3.0.0"
- slash "^3.0.0"
-
delayed-stream@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
@@ -5807,7 +5793,7 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
-fast-glob@^3.0.3, fast-glob@^3.1.1, fast-glob@^3.2.11, fast-glob@^3.2.9:
+fast-glob@^3.1.1, fast-glob@^3.2.11, fast-glob@^3.2.9:
version "3.2.11"
resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9"
integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==
@@ -6172,10 +6158,10 @@ gatsby-background-image@1.6.0:
short-uuid "^4.2.0"
sort-media-queries "^0.2.2"
-gatsby-cli@^4.10.1:
- version "4.10.1"
- resolved "https://registry.yarnpkg.com/gatsby-cli/-/gatsby-cli-4.10.1.tgz#0c077a7c14de4a95a70edd32916a94580ff3dbda"
- integrity sha512-bv1xJEAcv4vT3DKdOqT1W8qe4L0Yvw5sZoSXDSKX9K9YSGu/CnBJXPa31rNrv357mc4CyAf/Vdfnzvr0tNN+iQ==
+gatsby-cli@^4.10.2:
+ version "4.10.2"
+ resolved "https://registry.yarnpkg.com/gatsby-cli/-/gatsby-cli-4.10.2.tgz#835a2c472d5cd1b9258e5208f7f7184e5fd1b97b"
+ integrity sha512-lA1zFuWZwE+VtKYgntls0EC5PG4QoqqeJFWP+83Lmh+9hoLLkmL1plALBQeI3JY/9KXgRiC4OoR94CQkI329TA==
dependencies:
"@babel/code-frame" "^7.14.0"
"@babel/core" "^7.15.5"
@@ -6193,13 +6179,13 @@ gatsby-cli@^4.10.1:
common-tags "^1.8.2"
configstore "^5.0.1"
convert-hrtime "^3.0.0"
- create-gatsby "^2.10.1"
+ create-gatsby "^2.10.2"
envinfo "^7.8.1"
execa "^5.1.1"
fs-exists-cached "^1.0.0"
fs-extra "^10.0.0"
- gatsby-core-utils "^3.10.0"
- gatsby-telemetry "^3.10.0"
+ gatsby-core-utils "^3.10.1"
+ gatsby-telemetry "^3.10.1"
hosted-git-info "^3.0.8"
is-valid-path "^0.1.1"
joi "^17.4.2"
@@ -6223,10 +6209,10 @@ gatsby-cli@^4.10.1:
yoga-layout-prebuilt "^1.10.0"
yurnalist "^2.1.0"
-gatsby-core-utils@^3.10.0, gatsby-core-utils@^3.8.2:
- version "3.10.0"
- resolved "https://registry.yarnpkg.com/gatsby-core-utils/-/gatsby-core-utils-3.10.0.tgz#52be8a9a891d95686a7ee0c1cfef44f8e362232b"
- integrity sha512-yaRI/uUsbIggPRfh0y6CH+fy2AqbFFLxCYndw5nrVByEY40+KaKs0wOF4yIgPRBZZUHOyfBJ+1AGo2JLHdY5lA==
+gatsby-core-utils@^3.10.0, gatsby-core-utils@^3.10.1, gatsby-core-utils@^3.8.2:
+ version "3.10.1"
+ resolved "https://registry.yarnpkg.com/gatsby-core-utils/-/gatsby-core-utils-3.10.1.tgz#0f5e6aeda5ef4b86218b27480a9766fe30af4393"
+ integrity sha512-WqNMm0u1CAZm6Q+UQ4dDHwIAt3l32NeIaPuSXmDX7QcMGR3FUUk8cl2Ym6gx1hfILm1aCexqfaSCLUXtaWKkbQ==
dependencies:
"@babel/runtime" "^7.15.4"
ci-info "2.0.0"
@@ -6259,26 +6245,26 @@ gatsby-legacy-polyfills@^2.10.0:
"@babel/runtime" "^7.15.4"
core-js-compat "3.9.0"
-gatsby-link@^4.10.0:
- version "4.10.0"
- resolved "https://registry.yarnpkg.com/gatsby-link/-/gatsby-link-4.10.0.tgz#11565eca6df53e7952c44bc290791bb032fa88ce"
- integrity sha512-icF3i58MWgk4hSLaI6s5xyUp/rPy6MK7F4hsETQgJR32aZzkhj5Ydd1Cqw5P0CYo8EdaYKtljFBVwai8TnY4MQ==
+gatsby-link@^4.10.1:
+ version "4.10.1"
+ resolved "https://registry.yarnpkg.com/gatsby-link/-/gatsby-link-4.10.1.tgz#f68b04b900c9c81070913d65a6e4051a2266dc1b"
+ integrity sha512-U9Qry93Q+aXF9acs1YPH+wzipPlZELUa619CAhZnLv2sk75Iq5SttMZI/d0uhgF+X80PvoEKMkLb/VE4YiqVtw==
dependencies:
"@babel/runtime" "^7.15.4"
"@types/reach__router" "^1.3.10"
- gatsby-page-utils "^2.10.0"
+ gatsby-page-utils "^2.10.1"
prop-types "^15.7.2"
-gatsby-page-utils@^2.10.0:
- version "2.10.0"
- resolved "https://registry.yarnpkg.com/gatsby-page-utils/-/gatsby-page-utils-2.10.0.tgz#8d7729714ca2c5b416ed527eeaa59f5737d20888"
- integrity sha512-xyWHrMAJCd/w4mCZ1anK4ADT7pKdVZgQhppBWkm9H604p7RqsoloaQ9XGbPUuypzyPQw78yV5oY6bsaDpbvtrg==
+gatsby-page-utils@^2.10.1:
+ version "2.10.1"
+ resolved "https://registry.yarnpkg.com/gatsby-page-utils/-/gatsby-page-utils-2.10.1.tgz#39420dd41508ca2793f0c838816b16fd10bbc8d7"
+ integrity sha512-juhN7/cLKoFGPW37xBCN78D02yO1htxR3raO/f2iseCCsyDjXRnqGHgpdFu8g8s8bkukL5vscgALcyChQf7NtA==
dependencies:
"@babel/runtime" "^7.15.4"
bluebird "^3.7.2"
chokidar "^3.5.2"
fs-exists-cached "^1.0.0"
- gatsby-core-utils "^3.10.0"
+ gatsby-core-utils "^3.10.1"
glob "^7.2.0"
lodash "^4.17.21"
micromatch "^4.0.4"
@@ -6306,50 +6292,50 @@ gatsby-parcel-config@^0.1.0:
"@parcel/transformer-raw" "^2.3.1"
"@parcel/transformer-react-refresh-wrap" "^2.3.1"
-gatsby-plugin-image@2.10.0:
- version "2.10.0"
- resolved "https://registry.yarnpkg.com/gatsby-plugin-image/-/gatsby-plugin-image-2.10.0.tgz#8b4bb0bb2113ab5fa542e52e83f75228ff577703"
- integrity sha512-W6/RvRs27XG5TwxTEAhnY68g0LAqP6T2NDPPEzAe/V/x5PyPn5Zf/N1pPUoqqdJ2n48Wg2BSv3Asz5/4vHfRgw==
+gatsby-plugin-image@2.10.1:
+ version "2.10.1"
+ resolved "https://registry.yarnpkg.com/gatsby-plugin-image/-/gatsby-plugin-image-2.10.1.tgz#7b9eda7334487dd0e4693996cf3664835e9c356e"
+ integrity sha512-ZFcaKkVz6h18jRzP9HHCcXzyIc/Gj57NZSycOWFxW9KLqkq3NZXVx3mkV9EQ+rup8r3RLiJu/AXEorZEy7iAhQ==
dependencies:
"@babel/code-frame" "^7.14.0"
"@babel/parser" "^7.15.5"
"@babel/runtime" "^7.15.4"
"@babel/traverse" "^7.15.4"
babel-jsx-utils "^1.1.0"
- babel-plugin-remove-graphql-queries "^4.10.0"
+ babel-plugin-remove-graphql-queries "^4.10.1"
camelcase "^5.3.1"
chokidar "^3.5.2"
common-tags "^1.8.2"
fs-extra "^10.0.0"
- gatsby-core-utils "^3.10.0"
+ gatsby-core-utils "^3.10.1"
objectFitPolyfill "^2.3.5"
prop-types "^15.7.2"
-gatsby-plugin-manifest@4.10.1:
- version "4.10.1"
- resolved "https://registry.yarnpkg.com/gatsby-plugin-manifest/-/gatsby-plugin-manifest-4.10.1.tgz#01949125a70bac22f2d8946d5829b49f7f188ca2"
- integrity sha512-D4WYQD1gDdyvWt8RYl4OC/i7thPkgtkm+kZW+d1JVpUTu+BrbdPYCIUMGdSrDyKxx3x0bhMmEf9hZW25acew0Q==
+gatsby-plugin-manifest@4.10.2:
+ version "4.10.2"
+ resolved "https://registry.yarnpkg.com/gatsby-plugin-manifest/-/gatsby-plugin-manifest-4.10.2.tgz#117b44e0e219fa85d6b710d2ed985268d82a1e25"
+ integrity sha512-2QGrG3qFkUnp0IcxQ+uQS4/jPL4NMHShOEs/7JPsuIJSIdumnG7QYJ9xHbIBb8U5mIFLpeonADYJVbdTsnGtrg==
dependencies:
"@babel/runtime" "^7.15.4"
- gatsby-core-utils "^3.10.0"
- gatsby-plugin-utils "^3.4.1"
+ gatsby-core-utils "^3.10.1"
+ gatsby-plugin-utils "^3.4.2"
semver "^7.3.5"
sharp "^0.30.1"
-gatsby-plugin-page-creator@^4.10.1:
- version "4.10.1"
- resolved "https://registry.yarnpkg.com/gatsby-plugin-page-creator/-/gatsby-plugin-page-creator-4.10.1.tgz#6c5308daba53729225578ca67e52f117088502a5"
- integrity sha512-tTN4qHH2n7CiV/MNx/FcnBBOmCWzlMkpIR6AtJfxdO5sncn3XIEwMKNxvp9WUm2bevUodlynxlER1dOtgj+DJA==
+gatsby-plugin-page-creator@^4.10.2:
+ version "4.10.2"
+ resolved "https://registry.yarnpkg.com/gatsby-plugin-page-creator/-/gatsby-plugin-page-creator-4.10.2.tgz#05e6e3b0bdf800a4358573768987ed73d50eb158"
+ integrity sha512-6oVkPe69dGnq4ZiUgTuuIzTyOTmC/awXyfCdfkvQHQZRqhyzhHMW95aFgr3y/qNlOmCKDaxYmxeT0KOKxcyxWw==
dependencies:
"@babel/runtime" "^7.15.4"
"@babel/traverse" "^7.15.4"
"@sindresorhus/slugify" "^1.1.2"
chokidar "^3.5.2"
fs-exists-cached "^1.0.0"
- gatsby-core-utils "^3.10.0"
- gatsby-page-utils "^2.10.0"
- gatsby-plugin-utils "^3.4.1"
- gatsby-telemetry "^3.10.0"
+ gatsby-core-utils "^3.10.1"
+ gatsby-page-utils "^2.10.1"
+ gatsby-plugin-utils "^3.4.2"
+ gatsby-telemetry "^3.10.1"
globby "^11.0.4"
lodash "^4.17.21"
@@ -6376,10 +6362,10 @@ gatsby-plugin-robots-txt@1.7.0:
"@babel/runtime" "^7.16.7"
generate-robotstxt "^8.0.3"
-gatsby-plugin-sharp@4.10.1:
- version "4.10.1"
- resolved "https://registry.yarnpkg.com/gatsby-plugin-sharp/-/gatsby-plugin-sharp-4.10.1.tgz#d72145f7649b71a1e5051dcf7ed8f4d1f72bb041"
- integrity sha512-Y+kB5BSfcxMYO5s13W3NDeDH28RCzSa8goo1yQNTISiGaC6iBO4EIEVbUiUBkoLA5nf46J71ve8A3sprZ66bog==
+gatsby-plugin-sharp@4.10.2:
+ version "4.10.2"
+ resolved "https://registry.yarnpkg.com/gatsby-plugin-sharp/-/gatsby-plugin-sharp-4.10.2.tgz#253a49c452a7409ceece4e541e4770e61a306bcc"
+ integrity sha512-MWzPTYnu7HZ0kctHtkLbZOe6ZGUqSsNATO3lWlSBIFpeimxaPF5iHBiu1CX/ofz4pwt7VamtIzAV28VB6sjONw==
dependencies:
"@babel/runtime" "^7.15.4"
async "^3.2.3"
@@ -6387,9 +6373,9 @@ gatsby-plugin-sharp@4.10.1:
debug "^4.3.3"
filenamify "^4.3.0"
fs-extra "^10.0.0"
- gatsby-core-utils "^3.10.0"
- gatsby-plugin-utils "^3.4.1"
- gatsby-telemetry "^3.10.0"
+ gatsby-core-utils "^3.10.1"
+ gatsby-plugin-utils "^3.4.2"
+ gatsby-telemetry "^3.10.1"
got "^11.8.3"
lodash "^4.17.21"
mini-svg-data-uri "^1.4.3"
@@ -6401,10 +6387,10 @@ gatsby-plugin-sharp@4.10.1:
svgo "1.3.2"
uuid "3.4.0"
-gatsby-plugin-sitemap@5.10.1:
- version "5.10.1"
- resolved "https://registry.yarnpkg.com/gatsby-plugin-sitemap/-/gatsby-plugin-sitemap-5.10.1.tgz#297e9434802e1d829b257ab9627ba581f48cb154"
- integrity sha512-EO5GWLhkN3gfOXLX8QlbIepu2Kq1kk4bBgU5M2CjZAyVQhahZAJxdBat7JgLTpKZL4lSJgVSCl9IkeKgHvm+pg==
+gatsby-plugin-sitemap@5.10.2:
+ version "5.10.2"
+ resolved "https://registry.yarnpkg.com/gatsby-plugin-sitemap/-/gatsby-plugin-sitemap-5.10.2.tgz#208149b900b166c42aa88a5f5436f5c6bf6561e9"
+ integrity sha512-X6pVbytl/QfdfGrnXAEKPf5vc38WIbclmHYIfbgjXUYA9yckTxnfuYZqkS2YwCmbcUTHG1ugcmXMeBGVo77IBQ==
dependencies:
"@babel/runtime" "^7.15.4"
common-tags "^1.8.2"
@@ -6416,10 +6402,10 @@ gatsby-plugin-svgr@3.0.0-beta.0:
resolved "https://registry.yarnpkg.com/gatsby-plugin-svgr/-/gatsby-plugin-svgr-3.0.0-beta.0.tgz#7e5315f51dae2663a447899322ea1487cef93dd6"
integrity sha512-oALTh6VwO6l3khgC/vGr706aqt38EkXwdr6iXVei/auOKGxpCLEuDCQVal1a4SpYXdjHjRsEyab6bxaHL2lzsA==
-gatsby-plugin-typescript@^4.10.0:
- version "4.10.0"
- resolved "https://registry.yarnpkg.com/gatsby-plugin-typescript/-/gatsby-plugin-typescript-4.10.0.tgz#ab518d6cca48cfc0b19ab56ea778ed57ba0e7e52"
- integrity sha512-g6vbADv5+MRuNBkyvzpjzr2uwrkoNi/K+dAI2gcLdKQoITj6ZDTR9iB4yMF1s23XshlkwwN8+3/3VUiR1fguoQ==
+gatsby-plugin-typescript@^4.10.1:
+ version "4.10.1"
+ resolved "https://registry.yarnpkg.com/gatsby-plugin-typescript/-/gatsby-plugin-typescript-4.10.1.tgz#1d94532f4cd97677c38bda3b4d92a50b3856e11d"
+ integrity sha512-yQZYRAZwtj20OrvsF8+xr9V0Jew//3HghM1LKvCB58wECvwLW9SXHzema92JubirFOk7VrdeQfVe3u4jCYDDYw==
dependencies:
"@babel/core" "^7.15.5"
"@babel/plugin-proposal-nullish-coalescing-operator" "^7.14.5"
@@ -6427,16 +6413,16 @@ gatsby-plugin-typescript@^4.10.0:
"@babel/plugin-proposal-optional-chaining" "^7.14.5"
"@babel/preset-typescript" "^7.15.0"
"@babel/runtime" "^7.15.4"
- babel-plugin-remove-graphql-queries "^4.10.0"
+ babel-plugin-remove-graphql-queries "^4.10.1"
-gatsby-plugin-utils@^3.4.1:
- version "3.4.1"
- resolved "https://registry.yarnpkg.com/gatsby-plugin-utils/-/gatsby-plugin-utils-3.4.1.tgz#14c9cff75af32a32860575069af44bdabc8f65d9"
- integrity sha512-sDMVGauxMgXyX8WGZDndZI2vIaolJzlXBMdKhgP7DIT+Qa5wjvyHWvZy34dxtVrT3IHPK/PRMgpE81Gr7gKveg==
+gatsby-plugin-utils@^3.4.2:
+ version "3.4.2"
+ resolved "https://registry.yarnpkg.com/gatsby-plugin-utils/-/gatsby-plugin-utils-3.4.2.tgz#bdc66fd52c052c91af443981e1facbc097429dc7"
+ integrity sha512-HkVR8BnEdc915pmY2L9wPwFgjq303ThMH9UtT+frDOPzn+GFjPlBF5+YGJ3tZaxH0ouwpnGTn3Pu37tcRZcctA==
dependencies:
"@babel/runtime" "^7.15.4"
fs-extra "^10.0.0"
- gatsby-core-utils "^3.10.0"
+ gatsby-core-utils "^3.10.1"
gatsby-sharp "^0.4.0"
graphql-compose "^9.0.7"
import-from "^4.0.0"
@@ -6459,16 +6445,16 @@ gatsby-sharp@^0.4.0:
"@types/sharp" "^0.29.5"
sharp "^0.30.1"
-gatsby-source-filesystem@4.10.0:
- version "4.10.0"
- resolved "https://registry.yarnpkg.com/gatsby-source-filesystem/-/gatsby-source-filesystem-4.10.0.tgz#d51041c01b0e905a426f8ad81494175e2f2a1109"
- integrity sha512-fRN7MFVnmxljVmZZCYswNNMdFygB0hfHmtTM6kdbBc8llkRPtr9tsvK6LHnWsxU2tzPHDTGvRORcSs/coT2v3A==
+gatsby-source-filesystem@4.10.1:
+ version "4.10.1"
+ resolved "https://registry.yarnpkg.com/gatsby-source-filesystem/-/gatsby-source-filesystem-4.10.1.tgz#c513fadb3cedb138ff28ba351ffd264524a0c28d"
+ integrity sha512-qdOWS234l6QyEN0M8tfdGQF530pK9nSiaT1JfSzZV7Bl9psX9SdsuOtfZ2AV0QVt1BQB7C53E/BNGaxMLCcnUg==
dependencies:
"@babel/runtime" "^7.15.4"
chokidar "^3.5.2"
file-type "^16.5.3"
fs-extra "^10.0.0"
- gatsby-core-utils "^3.10.0"
+ gatsby-core-utils "^3.10.1"
got "^9.6.0"
md5-file "^5.0.0"
mime "^2.5.2"
@@ -6477,10 +6463,10 @@ gatsby-source-filesystem@4.10.0:
valid-url "^1.0.9"
xstate "^4.26.1"
-gatsby-telemetry@^3.10.0:
- version "3.10.0"
- resolved "https://registry.yarnpkg.com/gatsby-telemetry/-/gatsby-telemetry-3.10.0.tgz#917a4914e531d401ecf98ac87d29128b30bfab13"
- integrity sha512-Oe2OShJbylKr5C4FTl2P/JUX/xRkpYb6IMfEoAd5inG7HNQ1fikON4NdwvJjOp++My4kWo+LLCu92TZBkyTtZw==
+gatsby-telemetry@^3.10.1:
+ version "3.10.1"
+ resolved "https://registry.yarnpkg.com/gatsby-telemetry/-/gatsby-telemetry-3.10.1.tgz#129c4309811cd9b2ba5e9d326ba47dddb59202ca"
+ integrity sha512-935quI1YsQfzYREuvPLNKBb7IUE2vX9p7WoS7Dc9TbV2xDZPTAzeOfX+HE56ZltkxMi8Zivp7mqe5+n//WL7EQ==
dependencies:
"@babel/code-frame" "^7.14.0"
"@babel/runtime" "^7.15.4"
@@ -6490,7 +6476,7 @@ gatsby-telemetry@^3.10.0:
boxen "^4.2.0"
configstore "^5.0.1"
fs-extra "^10.0.0"
- gatsby-core-utils "^3.10.0"
+ gatsby-core-utils "^3.10.1"
git-up "^4.0.5"
is-docker "^2.2.1"
lodash "^4.17.21"
@@ -6520,18 +6506,18 @@ gatsby-transformer-yaml@4.10.0:
lodash "^4.17.21"
unist-util-select "^1.5.0"
-gatsby-worker@^1.10.0:
- version "1.10.0"
- resolved "https://registry.yarnpkg.com/gatsby-worker/-/gatsby-worker-1.10.0.tgz#19b958656c7a0ff2b52f24cf99b7c08131f5fa04"
- integrity sha512-s4y3bI2ltbfm+hBI9OgDRkrtTIgiHW97DnbikzZtF0lgclqDh/7vhFvTjKGejObR/dbV28t+SAMJLzd9klrgog==
+gatsby-worker@^1.10.1:
+ version "1.10.1"
+ resolved "https://registry.yarnpkg.com/gatsby-worker/-/gatsby-worker-1.10.1.tgz#d2549c9854effe3319bd4bd199be0a5c4d077af2"
+ integrity sha512-1bHZjWEKppJSLfuRGYIYhHZt9vYffptMPRs3zmrYBocmZcJvq0eNhTIXUvThbhP+2XHqAPHHBUcyKCwlWlMAzA==
dependencies:
"@babel/core" "^7.15.5"
"@babel/runtime" "^7.15.4"
-gatsby@4.10.1:
- version "4.10.1"
- resolved "https://registry.yarnpkg.com/gatsby/-/gatsby-4.10.1.tgz#b00f0454baffebfe38de10aeb4db8aa6e39a5e4a"
- integrity sha512-UCapYjofrdxa3bIjMUN0Y+EUIEHNX/srOonv03UeZRKHshwAPe6g1eZfXK4iFNy8LxNsH947D5hLN63pNK77zg==
+gatsby@4.10.3:
+ version "4.10.3"
+ resolved "https://registry.yarnpkg.com/gatsby/-/gatsby-4.10.3.tgz#72d9620d3f9a90c96e568f4803f86458d1dc6a53"
+ integrity sha512-G6YYwQWrN99KhJgLQl/oy3oKRuTdUcW7Bgb9vRchjY/Apk0eTA2wq33W5L9y+npR3nxly6ZJ2pM8FHw7WX4tKg==
dependencies:
"@babel/code-frame" "^7.14.0"
"@babel/core" "^7.15.5"
@@ -6558,8 +6544,8 @@ gatsby@4.10.1:
babel-plugin-add-module-exports "^1.0.4"
babel-plugin-dynamic-import-node "^2.3.3"
babel-plugin-lodash "^3.3.4"
- babel-plugin-remove-graphql-queries "^4.10.0"
- babel-preset-gatsby "^2.10.0"
+ babel-plugin-remove-graphql-queries "^4.10.1"
+ babel-preset-gatsby "^2.10.1"
better-opn "^2.1.1"
bluebird "^3.7.2"
body-parser "^1.19.0"
@@ -6578,7 +6564,6 @@ gatsby@4.10.1:
date-fns "^2.25.0"
debug "^3.2.7"
deepmerge "^4.2.2"
- del "^5.1.0"
detect-port "^1.3.0"
devcert "^1.2.0"
dotenv "^8.6.0"
@@ -6602,20 +6587,21 @@ gatsby@4.10.1:
find-cache-dir "^3.3.2"
fs-exists-cached "1.0.0"
fs-extra "^10.0.0"
- gatsby-cli "^4.10.1"
- gatsby-core-utils "^3.10.0"
+ gatsby-cli "^4.10.2"
+ gatsby-core-utils "^3.10.1"
gatsby-graphiql-explorer "^2.10.0"
gatsby-legacy-polyfills "^2.10.0"
- gatsby-link "^4.10.0"
- gatsby-page-utils "^2.10.0"
+ gatsby-link "^4.10.1"
+ gatsby-page-utils "^2.10.1"
gatsby-parcel-config "^0.1.0"
- gatsby-plugin-page-creator "^4.10.1"
- gatsby-plugin-typescript "^4.10.0"
- gatsby-plugin-utils "^3.4.1"
+ gatsby-plugin-page-creator "^4.10.2"
+ gatsby-plugin-typescript "^4.10.1"
+ gatsby-plugin-utils "^3.4.2"
gatsby-react-router-scroll "^5.10.0"
- gatsby-telemetry "^3.10.0"
- gatsby-worker "^1.10.0"
+ gatsby-telemetry "^3.10.1"
+ gatsby-worker "^1.10.1"
glob "^7.2.0"
+ globby "^11.1.0"
got "^11.8.2"
graphql "^15.7.2"
graphql-compose "^9.0.7"
@@ -6908,21 +6894,7 @@ globby@11.0.3:
merge2 "^1.3.0"
slash "^3.0.0"
-globby@^10.0.1:
- version "10.0.2"
- resolved "https://registry.yarnpkg.com/globby/-/globby-10.0.2.tgz#277593e745acaa4646c3ab411289ec47a0392543"
- integrity sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==
- dependencies:
- "@types/glob" "^7.1.1"
- array-union "^2.1.0"
- dir-glob "^3.0.1"
- fast-glob "^3.0.3"
- glob "^7.1.3"
- ignore "^5.1.1"
- merge2 "^1.2.3"
- slash "^3.0.0"
-
-globby@^11.0.3, globby@^11.0.4:
+globby@^11.0.3, globby@^11.0.4, globby@^11.1.0:
version "11.1.0"
resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b"
integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==
@@ -6968,7 +6940,7 @@ got@^9.6.0:
to-readable-stream "^1.0.0"
url-parse-lax "^3.0.0"
-graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.2, graceful-fs@^4.2.3, graceful-fs@^4.2.4, graceful-fs@^4.2.9:
+graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.3, graceful-fs@^4.2.4, graceful-fs@^4.2.9:
version "4.2.9"
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96"
integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==
@@ -7301,7 +7273,7 @@ ignore@^4.0.6:
resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc"
integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==
-ignore@^5.1.1, ignore@^5.1.4, ignore@^5.1.8, ignore@^5.2.0:
+ignore@^5.1.4, ignore@^5.1.8, ignore@^5.2.0:
version "5.2.0"
resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a"
integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==
@@ -7661,12 +7633,7 @@ is-obj@^2.0.0:
resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982"
integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==
-is-path-cwd@^2.2.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb"
- integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==
-
-is-path-inside@^3.0.1, is-path-inside@^3.0.2:
+is-path-inside@^3.0.2:
version "3.0.3"
resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283"
integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==
@@ -8562,7 +8529,7 @@ merge-stream@^2.0.0:
resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
-merge2@^1.2.3, merge2@^1.3.0, merge2@^1.4.1:
+merge2@^1.3.0, merge2@^1.4.1:
version "1.4.1"
resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
@@ -8729,9 +8696,9 @@ minimist-options@4.1.0:
kind-of "^6.0.3"
minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5:
- version "1.2.5"
- resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
- integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
+ version "1.2.6"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44"
+ integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==
mitt@^1.2.0:
version "1.2.0"
@@ -8831,10 +8798,10 @@ nano-css@^5.3.1:
stacktrace-js "^2.0.2"
stylis "^4.0.6"
-nanoid@3.3.1, nanoid@^3.3.1:
- version "3.3.1"
- resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.1.tgz#6347a18cac88af88f58af0b3594b723d5e99bb35"
- integrity sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==
+nanoid@3.3.2, nanoid@^3.3.1:
+ version "3.3.2"
+ resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.2.tgz#c89622fafb4381cd221421c69ec58547a1eec557"
+ integrity sha512-CuHBogktKwpm5g2sRgv83jEy2ijFzBwMoYA60orPDR7ynsLijJDqgsi4RDGj3OJpy3Ieb+LYwiRmIOGyytgITA==
nanomatch@^1.2.9:
version "1.2.13"
@@ -9306,13 +9273,6 @@ p-locate@^4.1.0:
dependencies:
p-limit "^2.2.0"
-p-map@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d"
- integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==
- dependencies:
- aggregate-error "^3.0.0"
-
p-map@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b"
@@ -9940,10 +9900,10 @@ prepend-http@^2.0.0:
resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897"
integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=
-prettier@2.6.0:
- version "2.6.0"
- resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.6.0.tgz#12f8f504c4d8ddb76475f441337542fa799207d4"
- integrity sha512-m2FgJibYrBGGgQXNzfd0PuDGShJgRavjUoRCw1mZERIWVSXF0iLzLm+aOqTAbLnC3n6JzUhAA8uZnFVghHJ86A==
+prettier@2.6.1:
+ version "2.6.1"
+ resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.6.1.tgz#d472797e0d7461605c1609808e27b80c0f9cfe17"
+ integrity sha512-8UVbTBYGwN37Bs9LERmxCPjdvPxlEowx2urIL6urHzdb3SDq4B/Z6xLFCblrSnE4iKWcS6ziJ3aOYrc1kz/E2A==
pretty-bytes@^5.4.1, pretty-bytes@^5.6.0:
version "5.6.0"