Merge remote-tracking branch 'origin/master' into wildcard-api
This commit is contained in:
commit
aa99006822
|
@ -1,6 +1,11 @@
|
||||||
name: Deploy website to Skynet
|
name: Deploy website to Skynet
|
||||||
|
|
||||||
on:
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
paths:
|
||||||
|
- "packages/website/**"
|
||||||
pull_request:
|
pull_request:
|
||||||
paths:
|
paths:
|
||||||
- "packages/website/**"
|
- "packages/website/**"
|
||||||
|
|
|
@ -0,0 +1,37 @@
|
||||||
|
name: Python Lint
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
paths:
|
||||||
|
- "**.py"
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
black:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- uses: actions/setup-python@v2
|
||||||
|
with:
|
||||||
|
python-version: "3.x"
|
||||||
|
architecture: x64
|
||||||
|
|
||||||
|
- run: pip install black
|
||||||
|
- run: black --check .
|
||||||
|
|
||||||
|
flake8:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- uses: actions/setup-python@v2
|
||||||
|
with:
|
||||||
|
python-version: "3.x"
|
||||||
|
architecture: x64
|
||||||
|
|
||||||
|
- run: pip install flake8
|
||||||
|
|
||||||
|
# E203: https://www.flake8rules.com/rules/E203.html - Whitespace before ':'
|
||||||
|
# E501: https://www.flake8rules.com/rules/E501.html - Line too long
|
||||||
|
# W503: https://www.flake8rules.com/rules/W503.html - Line break occurred before a binary operator
|
||||||
|
# W605: https://www.flake8rules.com/rules/W605.html - Invalid escape sequence
|
||||||
|
# E722: https://www.flake8rules.com/rules/E722.html - Do not use bare except, specify exception instead
|
||||||
|
- run: flake8 --max-line-length 88 --ignore E203,E501,W503,W605,E722
|
|
@ -0,0 +1 @@
|
||||||
|
- include tus header upload-concat in cors requests
|
|
@ -0,0 +1 @@
|
||||||
|
- fixed issue with caddy requesting new certificates instead of using existing ones from file storage
|
|
@ -0,0 +1 @@
|
||||||
|
- fixed the latest news link redirect in the news header
|
|
@ -0,0 +1 @@
|
||||||
|
- Set skyd up to connect to the local mongodb cluster for storing TUS metadata
|
|
@ -0,0 +1 @@
|
||||||
|
- Move MongoDB to a separate service (use `PORTAL_MODULES=m` to use it without accounts)
|
|
@ -0,0 +1 @@
|
||||||
|
- added unpinning skylinks from account dashboard
|
7
dc
7
dc
|
@ -10,13 +10,18 @@ COMPOSE_FILES="-f docker-compose.yml"
|
||||||
for i in $(seq 1 ${#PORTAL_MODULES}); do
|
for i in $(seq 1 ${#PORTAL_MODULES}); do
|
||||||
# accounts module - alias "a"
|
# accounts module - alias "a"
|
||||||
if [[ ${PORTAL_MODULES:i-1:1} == "a" ]]; then
|
if [[ ${PORTAL_MODULES:i-1:1} == "a" ]]; then
|
||||||
COMPOSE_FILES+=" -f docker-compose.accounts.yml"
|
COMPOSE_FILES+=" -f docker-compose.mongodb.yml -f docker-compose.accounts.yml"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# jaeger module - alias "j"
|
# jaeger module - alias "j"
|
||||||
if [[ ${PORTAL_MODULES:i-1:1} == "j" ]]; then
|
if [[ ${PORTAL_MODULES:i-1:1} == "j" ]]; then
|
||||||
COMPOSE_FILES+=" -f docker-compose.jaeger.yml"
|
COMPOSE_FILES+=" -f docker-compose.jaeger.yml"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# mongodb module - alias "m". implied by "a"
|
||||||
|
if [[ ${PORTAL_MODULES:i-1:1} == "m" ]]; then
|
||||||
|
COMPOSE_FILES+=" -f docker-compose.mongodb.yml"
|
||||||
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
# override file if exists
|
# override file if exists
|
||||||
|
|
|
@ -50,21 +50,6 @@ services:
|
||||||
- mongo
|
- mongo
|
||||||
- oathkeeper
|
- oathkeeper
|
||||||
|
|
||||||
mongo:
|
|
||||||
image: mongo:4.4.1
|
|
||||||
command: --keyFile=/data/mgkey --replSet=skynet
|
|
||||||
container_name: mongo
|
|
||||||
restart: unless-stopped
|
|
||||||
logging: *default-logging
|
|
||||||
volumes:
|
|
||||||
- ./docker/data/mongo/db:/data/db
|
|
||||||
- ./docker/data/mongo/mgkey:/data/mgkey:rw
|
|
||||||
networks:
|
|
||||||
shared:
|
|
||||||
ipv4_address: 10.10.10.71
|
|
||||||
ports:
|
|
||||||
- "27017:27017"
|
|
||||||
|
|
||||||
kratos-migrate:
|
kratos-migrate:
|
||||||
image: oryd/kratos:v0.5.5-alpha.1
|
image: oryd/kratos:v0.5.5-alpha.1
|
||||||
container_name: kratos-migrate
|
container_name: kratos-migrate
|
||||||
|
|
|
@ -0,0 +1,23 @@
|
||||||
|
version: "3.7"
|
||||||
|
|
||||||
|
x-logging: &default-logging
|
||||||
|
driver: json-file
|
||||||
|
options:
|
||||||
|
max-size: "10m"
|
||||||
|
max-file: "3"
|
||||||
|
|
||||||
|
services:
|
||||||
|
mongo:
|
||||||
|
image: mongo:4.4.1
|
||||||
|
command: --keyFile=/data/mgkey --replSet=skynet
|
||||||
|
container_name: mongo
|
||||||
|
restart: unless-stopped
|
||||||
|
logging: *default-logging
|
||||||
|
volumes:
|
||||||
|
- ./docker/data/mongo/db:/data/db
|
||||||
|
- ./docker/data/mongo/mgkey:/data/mgkey:rw
|
||||||
|
networks:
|
||||||
|
shared:
|
||||||
|
ipv4_address: 10.10.10.71
|
||||||
|
ports:
|
||||||
|
- "${SKYNET_DB_PORT}:27017"
|
|
@ -25,6 +25,10 @@ services:
|
||||||
logging: *default-logging
|
logging: *default-logging
|
||||||
environment:
|
environment:
|
||||||
- SIA_MODULES=gctwr
|
- SIA_MODULES=gctwr
|
||||||
|
- MONGODB_URI=mongodb://${SKYNET_DB_HOST}:${SKYNET_DB_PORT}
|
||||||
|
- MONGODB_USER=${SKYNET_DB_USER}
|
||||||
|
- MONGODB_PASSWORD=${SKYNET_DB_PASS}
|
||||||
|
|
||||||
env_file:
|
env_file:
|
||||||
- .env
|
- .env
|
||||||
volumes:
|
volumes:
|
||||||
|
|
|
@ -3,7 +3,7 @@ FROM caddy:2.4.5-builder AS caddy-builder
|
||||||
# available dns resolvers: https://github.com/caddy-dns
|
# available dns resolvers: https://github.com/caddy-dns
|
||||||
RUN xcaddy build --with github.com/caddy-dns/route53
|
RUN xcaddy build --with github.com/caddy-dns/route53
|
||||||
|
|
||||||
FROM caddy:2.4.5-builder
|
FROM caddy:2.4.5-alpine
|
||||||
|
|
||||||
COPY --from=caddy-builder /usr/bin/caddy /usr/bin/caddy
|
COPY --from=caddy-builder /usr/bin/caddy /usr/bin/caddy
|
||||||
|
|
||||||
|
|
|
@ -20,13 +20,12 @@
|
||||||
"issuers": [
|
"issuers": [
|
||||||
{
|
{
|
||||||
"module": "acme",
|
"module": "acme",
|
||||||
|
"email": "{{EMAIL_ADDRESS}}",
|
||||||
"challenges": {
|
"challenges": {
|
||||||
"dns": {
|
"dns": {
|
||||||
"provider": {
|
"provider": {
|
||||||
"name": "route53",
|
"name": "route53"
|
||||||
"max_retries": 100
|
}
|
||||||
},
|
|
||||||
ttl: "15m"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
FROM node:16.9.1-alpine
|
FROM node:16.10.0-alpine
|
||||||
|
|
||||||
WORKDIR /opt/hsd
|
WORKDIR /opt/hsd
|
||||||
|
|
||||||
|
|
|
@ -97,7 +97,7 @@
|
||||||
preserve_host: true
|
preserve_host: true
|
||||||
url: "http://accounts:3000"
|
url: "http://accounts:3000"
|
||||||
match:
|
match:
|
||||||
url: "http://oathkeeper<{,:4455}>/<{login,logout,user,user/uploads,user/downloads,user/stats}>"
|
url: "http://oathkeeper<{,:4455}>/<{login,logout,user,user/uploads,user/uploads/*,user/downloads,user/stats}>"
|
||||||
methods:
|
methods:
|
||||||
- GET
|
- GET
|
||||||
- POST
|
- POST
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
more_set_headers 'Access-Control-Allow-Origin: $http_origin';
|
more_set_headers 'Access-Control-Allow-Origin: $http_origin';
|
||||||
more_set_headers 'Access-Control-Allow-Credentials: true';
|
more_set_headers 'Access-Control-Allow-Credentials: true';
|
||||||
more_set_headers 'Access-Control-Allow-Methods: GET, POST, HEAD, OPTIONS, PUT, PATCH, DELETE';
|
more_set_headers 'Access-Control-Allow-Methods: GET, POST, HEAD, OPTIONS, PUT, PATCH, DELETE';
|
||||||
more_set_headers 'Access-Control-Allow-Headers: DNT,User-Agent,X-Requested-With,If-Modified-Since,If-None-Match,Cache-Control,Content-Type,Range,X-HTTP-Method-Override,upload-offset,upload-metadata,upload-length,tus-version,tus-resumable,tus-extension,tus-max-size,location';
|
more_set_headers 'Access-Control-Allow-Headers: DNT,User-Agent,X-Requested-With,If-Modified-Since,If-None-Match,Cache-Control,Content-Type,Range,X-HTTP-Method-Override,upload-offset,upload-metadata,upload-length,tus-version,tus-resumable,tus-extension,tus-max-size,upload-concat,location';
|
||||||
more_set_headers 'Access-Control-Expose-Headers: Content-Length,Content-Range,ETag,Skynet-File-Metadata,Skynet-Skylink,Skynet-Proof,Skynet-Portal-Api,Skynet-Server-Api,upload-offset,upload-metadata,upload-length,tus-version,tus-resumable,tus-extension,tus-max-size,location';
|
more_set_headers 'Access-Control-Expose-Headers: Content-Length,Content-Range,ETag,Skynet-File-Metadata,Skynet-Skylink,Skynet-Proof,Skynet-Portal-Api,Skynet-Server-Api,upload-offset,upload-metadata,upload-length,tus-version,tus-resumable,tus-extension,tus-max-size,upload-concat,location';
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
FROM node:16.9.1-alpine
|
FROM node:16.10.0-alpine
|
||||||
|
|
||||||
WORKDIR /usr/app
|
WORKDIR /usr/app
|
||||||
|
|
||||||
|
@ -10,6 +10,6 @@ RUN yarn --frozen-lockfile
|
||||||
COPY public ./public
|
COPY public ./public
|
||||||
COPY src ./src
|
COPY src ./src
|
||||||
COPY styles ./styles
|
COPY styles ./styles
|
||||||
COPY next.config.js postcss.config.js tailwind.config.js ./
|
COPY postcss.config.js tailwind.config.js ./
|
||||||
|
|
||||||
CMD ["sh", "-c", "env | grep -E 'NEXT_PUBLIC|KRATOS|STRIPE' > .env.local && yarn build && yarn start"]
|
CMD ["sh", "-c", "env | grep -E 'NEXT_PUBLIC|KRATOS|STRIPE' > .env.local && yarn build && yarn start"]
|
||||||
|
|
|
@ -1,3 +0,0 @@
|
||||||
module.exports = {
|
|
||||||
webpack5: true,
|
|
||||||
};
|
|
|
@ -10,10 +10,10 @@
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@fontsource/metropolis": "4.5.0",
|
"@fontsource/metropolis": "4.5.0",
|
||||||
"@ory/kratos-client": "0.5.4-alpha.1",
|
"@ory/kratos-client": "0.5.4-alpha.1",
|
||||||
"@stripe/react-stripe-js": "1.4.1",
|
"@stripe/react-stripe-js": "1.5.0",
|
||||||
"@stripe/stripe-js": "1.17.1",
|
"@stripe/stripe-js": "1.19.1",
|
||||||
"@tailwindcss/forms": "0.3.3",
|
"@tailwindcss/forms": "0.3.4",
|
||||||
"autoprefixer": "10.3.4",
|
"autoprefixer": "10.3.7",
|
||||||
"classnames": "2.3.1",
|
"classnames": "2.3.1",
|
||||||
"clipboardy": "2.3.0",
|
"clipboardy": "2.3.0",
|
||||||
"dayjs": "1.10.7",
|
"dayjs": "1.10.7",
|
||||||
|
@ -23,16 +23,21 @@
|
||||||
"http-status-codes": "2.1.4",
|
"http-status-codes": "2.1.4",
|
||||||
"ky": "0.25.1",
|
"ky": "0.25.1",
|
||||||
"next": "11.1.2",
|
"next": "11.1.2",
|
||||||
"postcss": "8.3.6",
|
"normalize.css": "8.0.1",
|
||||||
|
"postcss": "8.3.9",
|
||||||
"prettier": "2.4.1",
|
"prettier": "2.4.1",
|
||||||
"pretty-bytes": "5.6.0",
|
"pretty-bytes": "5.6.0",
|
||||||
"react": "17.0.2",
|
"react": "17.0.2",
|
||||||
"react-dom": "17.0.2",
|
"react-dom": "17.0.2",
|
||||||
|
"react-toastify": "8.0.3",
|
||||||
"skynet-js": "3.0.2",
|
"skynet-js": "3.0.2",
|
||||||
"stripe": "8.176.0",
|
"stripe": "8.181.0",
|
||||||
"superagent": "6.1.0",
|
"superagent": "6.1.0",
|
||||||
"swr": "1.0.1",
|
"swr": "1.0.1",
|
||||||
"tailwindcss": "2.2.15",
|
"tailwindcss": "2.2.16",
|
||||||
"yup": "0.32.9"
|
"yup": "0.32.9"
|
||||||
|
},
|
||||||
|
"resolutions": {
|
||||||
|
"axios": "0.21.4"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import { useEffect } from "react";
|
import { useEffect } from "react";
|
||||||
import classnames from "classnames";
|
import classnames from "classnames";
|
||||||
|
|
||||||
function Button({ children, disabled, className, ...props }) {
|
function Button({ children, disabled, ...props }) {
|
||||||
return (
|
return (
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
|
@ -10,8 +10,7 @@ function Button({ children, disabled, className, ...props }) {
|
||||||
{
|
{
|
||||||
"hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-green-500": !disabled,
|
"hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-green-500": !disabled,
|
||||||
"cursor-auto opacity-50": disabled,
|
"cursor-auto opacity-50": disabled,
|
||||||
},
|
}
|
||||||
className
|
|
||||||
)}
|
)}
|
||||||
disabled={disabled}
|
disabled={disabled}
|
||||||
{...props}
|
{...props}
|
||||||
|
@ -21,7 +20,26 @@ function Button({ children, disabled, className, ...props }) {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
export default function Table({ items, count, headers, actions, offset, setOffset, pageSize = 10 }) {
|
function ButtonAction({ children, disabled, ...props }) {
|
||||||
|
return (
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
className={classnames(
|
||||||
|
"inline-flex items-center px-2.5 py-1.5 border border-gray-300 shadow-sm text-xs font-medium rounded text-gray-700 bg-white",
|
||||||
|
{
|
||||||
|
"hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-green-500": !disabled,
|
||||||
|
"cursor-auto opacity-50": disabled,
|
||||||
|
}
|
||||||
|
)}
|
||||||
|
disabled={disabled}
|
||||||
|
{...props}
|
||||||
|
>
|
||||||
|
{children}
|
||||||
|
</button>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default function Table({ items, count, headers, mutate, actions, offset, setOffset, pageSize = 10 }) {
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (offset < 0) setOffset(0);
|
if (offset < 0) setOffset(0);
|
||||||
else if (offset >= count && count > 0) setOffset(Math.floor(count / pageSize - 1) * pageSize);
|
else if (offset >= count && count > 0) setOffset(Math.floor(count / pageSize - 1) * pageSize);
|
||||||
|
@ -45,8 +63,8 @@ export default function Table({ items, count, headers, actions, offset, setOffse
|
||||||
{name}
|
{name}
|
||||||
</th>
|
</th>
|
||||||
))}
|
))}
|
||||||
{actions.map(({ key, name }) => (
|
{actions.map(({ name }, index) => (
|
||||||
<th key={key} scope="col" className="relative px-6 py-3">
|
<th key={index} scope="col" className="relative px-6 py-3">
|
||||||
<span className="sr-only">{name}</span>
|
<span className="sr-only">{name}</span>
|
||||||
</th>
|
</th>
|
||||||
))}
|
))}
|
||||||
|
@ -56,7 +74,7 @@ export default function Table({ items, count, headers, actions, offset, setOffse
|
||||||
{items && items.length ? (
|
{items && items.length ? (
|
||||||
items.map((row, index) => (
|
items.map((row, index) => (
|
||||||
<tr className={index % 2 ? "bg-gray-100" : "bg-white"} key={index}>
|
<tr className={index % 2 ? "bg-gray-100" : "bg-white"} key={index}>
|
||||||
{headers.map(({ key, formatter, href, nowrap = true }) => (
|
{headers.map(({ key, formatter, href, nowrap }) => (
|
||||||
<td
|
<td
|
||||||
key={key}
|
key={key}
|
||||||
className={`${nowrap ? "whitespace-nowrap" : ""} px-6 py-4 text-sm font-medium text-gray-900`}
|
className={`${nowrap ? "whitespace-nowrap" : ""} px-6 py-4 text-sm font-medium text-gray-900`}
|
||||||
|
@ -77,11 +95,9 @@ export default function Table({ items, count, headers, actions, offset, setOffse
|
||||||
)) || <>—</>}
|
)) || <>—</>}
|
||||||
</td>
|
</td>
|
||||||
))}
|
))}
|
||||||
{actions.map(({ key, name, action }) => (
|
{actions.map(({ name, action }, index) => (
|
||||||
<td key={key} className="px-6 py-4 whitespace-nowrap text-right text-sm font-medium">
|
<td key={index} className="px-6 py-4 whitespace-nowrap text-right text-sm font-medium">
|
||||||
<a href="#" className="text-green-600 hover:text-green-900" onClick={action}>
|
<ButtonAction onClick={() => action(row, mutate)}>{name}</ButtonAction>
|
||||||
{name}
|
|
||||||
</a>
|
|
||||||
</td>
|
</td>
|
||||||
))}
|
))}
|
||||||
</tr>
|
</tr>
|
||||||
|
@ -107,15 +123,11 @@ export default function Table({ items, count, headers, actions, offset, setOffse
|
||||||
<span className="font-medium">{count}</span> results
|
<span className="font-medium">{count}</span> results
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex-1 flex justify-between sm:justify-end">
|
<div className="flex-1 flex justify-between sm:justify-end space-x-3">
|
||||||
<Button disabled={offset - pageSize < 0} onClick={() => setOffset(offset - pageSize)}>
|
<Button disabled={offset - pageSize < 0} onClick={() => setOffset(offset - pageSize)}>
|
||||||
Previous
|
Previous
|
||||||
</Button>
|
</Button>
|
||||||
<Button
|
<Button disabled={offset + pageSize >= count} onClick={() => setOffset(offset + pageSize)}>
|
||||||
className="ml-3"
|
|
||||||
disabled={offset + pageSize >= count}
|
|
||||||
onClick={() => setOffset(offset + pageSize)}
|
|
||||||
>
|
|
||||||
Next
|
Next
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -1,6 +1,9 @@
|
||||||
import { Elements } from "@stripe/react-stripe-js";
|
import { Elements } from "@stripe/react-stripe-js";
|
||||||
import { loadStripe } from "@stripe/stripe-js";
|
import { loadStripe } from "@stripe/stripe-js";
|
||||||
|
import { ToastContainer } from "react-toastify";
|
||||||
import Head from "next/head";
|
import Head from "next/head";
|
||||||
|
import "normalize.css";
|
||||||
|
import "react-toastify/dist/ReactToastify.css";
|
||||||
import "tailwindcss/tailwind.css";
|
import "tailwindcss/tailwind.css";
|
||||||
import "@fontsource/metropolis/all.css";
|
import "@fontsource/metropolis/all.css";
|
||||||
|
|
||||||
|
@ -14,6 +17,7 @@ function MyApp({ Component, pageProps }) {
|
||||||
<title key="title">Skynet</title>
|
<title key="title">Skynet</title>
|
||||||
</Head>
|
</Head>
|
||||||
<Component {...pageProps} />
|
<Component {...pageProps} />
|
||||||
|
<ToastContainer bodyClassName={() => "Toastify__toast-body text-sm font-medium text-palette-500"} />
|
||||||
</Elements>
|
</Elements>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,6 +10,8 @@ export default async (req, res) => {
|
||||||
res.setHeader("Set-Cookie", header["set-cookie"]);
|
res.setHeader("Set-Cookie", header["set-cookie"]);
|
||||||
res.redirect(req.query.return_to ?? "/");
|
res.redirect(req.query.return_to ?? "/");
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
console.log(`Cookie is present but authentication failed: ${error.message}`);
|
||||||
|
|
||||||
// credentials were correct but accounts service failed
|
// credentials were correct but accounts service failed
|
||||||
res.redirect("/.ory/kratos/public/self-service/browser/flows/logout");
|
res.redirect("/.ory/kratos/public/self-service/browser/flows/logout");
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,6 +32,8 @@ export async function getServerSideProps(context) {
|
||||||
|
|
||||||
throw new Error(`Failed to retrieve flow ${flow} with code ${status}`);
|
throw new Error(`Failed to retrieve flow ${flow} with code ${status}`);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
console.log(`Unexpected error retrieving login flow: ${error.message}`);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
redirect: {
|
redirect: {
|
||||||
permanent: false,
|
permanent: false,
|
||||||
|
|
|
@ -35,6 +35,8 @@ export async function getServerSideProps(context) {
|
||||||
|
|
||||||
throw new Error(`Failed to retrieve flow ${flow} with code ${status}`);
|
throw new Error(`Failed to retrieve flow ${flow} with code ${status}`);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
console.log(`Unexpected error retrieving registration flow: ${error.message}`);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
redirect: {
|
redirect: {
|
||||||
permanent: false,
|
permanent: false,
|
||||||
|
|
|
@ -12,8 +12,25 @@ const apiPrefix = process.env.NODE_ENV === "development" ? "/api/stubs" : "";
|
||||||
const getSkylinkLink = ({ skylink }) => skynetClient.getSkylinkUrl(skylink);
|
const getSkylinkLink = ({ skylink }) => skynetClient.getSkylinkUrl(skylink);
|
||||||
const getRelativeDate = ({ downloadedOn }) => dayjs(downloadedOn).format("YYYY-MM-DD HH:mm:ss");
|
const getRelativeDate = ({ downloadedOn }) => dayjs(downloadedOn).format("YYYY-MM-DD HH:mm:ss");
|
||||||
const headers = [
|
const headers = [
|
||||||
{ key: "name", name: "Name", nowrap: false, href: getSkylinkLink },
|
{
|
||||||
{ key: "skylink", name: "Skylink" },
|
key: "name",
|
||||||
|
name: "File",
|
||||||
|
formatter: ({ name, skylink }) => (
|
||||||
|
<>
|
||||||
|
<p>
|
||||||
|
<a
|
||||||
|
href={getSkylinkLink({ skylink })}
|
||||||
|
className="text-green-600 hover:text-green-900 break-all"
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
>
|
||||||
|
{name}
|
||||||
|
</a>
|
||||||
|
</p>
|
||||||
|
<p className="text-gray-500 text-xs">{skylink}</p>
|
||||||
|
</>
|
||||||
|
),
|
||||||
|
},
|
||||||
{ key: "size", name: "Size", formatter: ({ size }) => prettyBytes(size) },
|
{ key: "size", name: "Size", formatter: ({ size }) => prettyBytes(size) },
|
||||||
{ key: "downloadedOn", name: "Accessed on", formatter: getRelativeDate },
|
{ key: "downloadedOn", name: "Accessed on", formatter: getRelativeDate },
|
||||||
];
|
];
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
import dayjs from "dayjs";
|
import dayjs from "dayjs";
|
||||||
import prettyBytes from "pretty-bytes";
|
import prettyBytes from "pretty-bytes";
|
||||||
import { useState } from "react";
|
import { useState } from "react";
|
||||||
|
import ky from "ky/umd";
|
||||||
|
import { toast } from "react-toastify";
|
||||||
import Layout from "../components/Layout";
|
import Layout from "../components/Layout";
|
||||||
import Table from "../components/Table";
|
import Table from "../components/Table";
|
||||||
import authServerSideProps from "../services/authServerSideProps";
|
import authServerSideProps from "../services/authServerSideProps";
|
||||||
|
@ -12,12 +14,42 @@ const apiPrefix = process.env.NODE_ENV === "development" ? "/api/stubs" : "";
|
||||||
const getSkylinkLink = ({ skylink }) => skynetClient.getSkylinkUrl(skylink);
|
const getSkylinkLink = ({ skylink }) => skynetClient.getSkylinkUrl(skylink);
|
||||||
const getRelativeDate = ({ uploadedOn }) => dayjs(uploadedOn).format("YYYY-MM-DD HH:mm:ss");
|
const getRelativeDate = ({ uploadedOn }) => dayjs(uploadedOn).format("YYYY-MM-DD HH:mm:ss");
|
||||||
const headers = [
|
const headers = [
|
||||||
{ key: "name", name: "Name", nowrap: false, href: getSkylinkLink },
|
{
|
||||||
{ key: "skylink", name: "Skylink" },
|
key: "name",
|
||||||
|
name: "File",
|
||||||
|
formatter: ({ name, skylink }) => (
|
||||||
|
<>
|
||||||
|
<p>
|
||||||
|
<a
|
||||||
|
href={getSkylinkLink({ skylink })}
|
||||||
|
className="text-green-600 hover:text-green-900 break-all"
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
>
|
||||||
|
{name}
|
||||||
|
</a>
|
||||||
|
</p>
|
||||||
|
<p className="text-gray-500 text-xs">{skylink}</p>
|
||||||
|
</>
|
||||||
|
),
|
||||||
|
},
|
||||||
{ key: "size", name: "Size", formatter: ({ size }) => prettyBytes(size) },
|
{ key: "size", name: "Size", formatter: ({ size }) => prettyBytes(size) },
|
||||||
{ key: "uploadedOn", name: "Uploaded on", formatter: getRelativeDate },
|
{ key: "uploadedOn", name: "Uploaded on", formatter: getRelativeDate },
|
||||||
];
|
];
|
||||||
const actions = [];
|
const actions = [
|
||||||
|
{
|
||||||
|
name: "Unpin Skylink",
|
||||||
|
action: async ({ skylink }, mutate) => {
|
||||||
|
await toast.promise(ky.delete(`/user/uploads/${skylink}`), {
|
||||||
|
pending: "Unpinning Skylink",
|
||||||
|
success: "Skylink unpinned",
|
||||||
|
error: (error) => error.message,
|
||||||
|
});
|
||||||
|
|
||||||
|
mutate();
|
||||||
|
},
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
export const getServerSideProps = authServerSideProps(async (context, api) => {
|
export const getServerSideProps = authServerSideProps(async (context, api) => {
|
||||||
const initialData = await api.get("user/uploads?pageSize=10&offset=0").json();
|
const initialData = await api.get("user/uploads?pageSize=10&offset=0").json();
|
||||||
|
@ -27,7 +59,7 @@ export const getServerSideProps = authServerSideProps(async (context, api) => {
|
||||||
|
|
||||||
export default function Uploads({ initialData }) {
|
export default function Uploads({ initialData }) {
|
||||||
const [offset, setOffset] = useState(0);
|
const [offset, setOffset] = useState(0);
|
||||||
const { data } = useAccountsApi(`${apiPrefix}/user/uploads?pageSize=10&offset=${offset}`, {
|
const { data, mutate } = useAccountsApi(`${apiPrefix}/user/uploads?pageSize=10&offset=${offset}`, {
|
||||||
initialData: offset === 0 ? initialData : undefined,
|
initialData: offset === 0 ? initialData : undefined,
|
||||||
revalidateOnMount: true,
|
revalidateOnMount: true,
|
||||||
});
|
});
|
||||||
|
@ -38,7 +70,7 @@ export default function Uploads({ initialData }) {
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Layout title="Your uploads">
|
<Layout title="Your uploads">
|
||||||
<Table {...data} headers={headers} actions={actions} setOffset={setOffset} />
|
<Table {...data} mutate={mutate} headers={headers} actions={actions} setOffset={setOffset} />
|
||||||
</Layout>
|
</Layout>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,17 @@ const isProduction = process.env.NODE_ENV === "production";
|
||||||
|
|
||||||
export default function authServerSideProps(getServerSideProps) {
|
export default function authServerSideProps(getServerSideProps) {
|
||||||
return function authenticate(context) {
|
return function authenticate(context) {
|
||||||
if (isProduction && (!("ory_kratos_session" in context.req.cookies) || !("skynet-jwt" in context.req.cookies))) {
|
const authCookies = ["ory_kratos_session", "skynet-jwt"];
|
||||||
|
|
||||||
|
if (isProduction && !authCookies.every((cookie) => context.req.cookies[cookie])) {
|
||||||
|
// it is higly unusual that some of the cookies would be set but other would not
|
||||||
|
if (authCookies.some((cookie) => context.req.cookies[cookie])) {
|
||||||
|
console.log(
|
||||||
|
"Unexpected auth cookies state!",
|
||||||
|
authCookies.map((cookie) => `[${cookie}] is ${context.req.cookies[cookie] ? "set" : "not set"}`)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
redirect: {
|
redirect: {
|
||||||
permanent: false,
|
permanent: false,
|
||||||
|
|
|
@ -21,15 +21,10 @@
|
||||||
resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz#5ac822ce97eec46741ab70a517971e443a70c5a9"
|
resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz#5ac822ce97eec46741ab70a517971e443a70c5a9"
|
||||||
integrity sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==
|
integrity sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==
|
||||||
|
|
||||||
"@babel/helper-validator-identifier@^7.14.5":
|
"@babel/helper-validator-identifier@^7.14.5", "@babel/helper-validator-identifier@^7.14.9":
|
||||||
version "7.14.8"
|
version "7.15.7"
|
||||||
resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.8.tgz#32be33a756f29e278a0d644fa08a2c9e0f88a34c"
|
resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz#220df993bfe904a4a6b02ab4f3385a5ebf6e2389"
|
||||||
integrity sha512-ZGy6/XQjllhYQrNw/3zfWRwZCTVSiBLZ9DHVZxn9n2gip/7ab8mv2TWlKPIBk26RwedCBoWdjLmn+t9na2Gcow==
|
integrity sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==
|
||||||
|
|
||||||
"@babel/helper-validator-identifier@^7.14.9":
|
|
||||||
version "7.14.9"
|
|
||||||
resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz#6654d171b2024f6d8ee151bf2509699919131d48"
|
|
||||||
integrity sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==
|
|
||||||
|
|
||||||
"@babel/highlight@^7.10.4", "@babel/highlight@^7.14.5":
|
"@babel/highlight@^7.10.4", "@babel/highlight@^7.14.5":
|
||||||
version "7.14.5"
|
version "7.14.5"
|
||||||
|
@ -47,13 +42,20 @@
|
||||||
dependencies:
|
dependencies:
|
||||||
"@babel/helper-plugin-utils" "^7.14.5"
|
"@babel/helper-plugin-utils" "^7.14.5"
|
||||||
|
|
||||||
"@babel/runtime@7.15.3", "@babel/runtime@^7.10.5", "@babel/runtime@^7.11.2":
|
"@babel/runtime@7.15.3":
|
||||||
version "7.15.3"
|
version "7.15.3"
|
||||||
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.15.3.tgz#2e1c2880ca118e5b2f9988322bd8a7656a32502b"
|
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.15.3.tgz#2e1c2880ca118e5b2f9988322bd8a7656a32502b"
|
||||||
integrity sha512-OvwMLqNXkCXSz1kSm58sEsNuhqOx/fKpnUnKnFB5v8uDda5bLNEHNgKPvhDN6IU0LDcnHQ90LlJ0Q6jnyBSIBA==
|
integrity sha512-OvwMLqNXkCXSz1kSm58sEsNuhqOx/fKpnUnKnFB5v8uDda5bLNEHNgKPvhDN6IU0LDcnHQ90LlJ0Q6jnyBSIBA==
|
||||||
dependencies:
|
dependencies:
|
||||||
regenerator-runtime "^0.13.4"
|
regenerator-runtime "^0.13.4"
|
||||||
|
|
||||||
|
"@babel/runtime@^7.10.5", "@babel/runtime@^7.11.2":
|
||||||
|
version "7.15.4"
|
||||||
|
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.15.4.tgz#fd17d16bfdf878e6dd02d19753a39fa8a8d9c84a"
|
||||||
|
integrity sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw==
|
||||||
|
dependencies:
|
||||||
|
regenerator-runtime "^0.13.4"
|
||||||
|
|
||||||
"@babel/types@7.15.0":
|
"@babel/types@7.15.0":
|
||||||
version "7.15.0"
|
version "7.15.0"
|
||||||
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.15.0.tgz#61af11f2286c4e9c69ca8deb5f4375a73c72dcbd"
|
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.15.0.tgz#61af11f2286c4e9c69ca8deb5f4375a73c72dcbd"
|
||||||
|
@ -76,9 +78,9 @@
|
||||||
"@hapi/hoek" "9.x.x"
|
"@hapi/hoek" "9.x.x"
|
||||||
|
|
||||||
"@hapi/boom@9.x.x":
|
"@hapi/boom@9.x.x":
|
||||||
version "9.1.3"
|
version "9.1.4"
|
||||||
resolved "https://registry.yarnpkg.com/@hapi/boom/-/boom-9.1.3.tgz#22cad56e39b7a4819161a99b1db19eaaa9b6cc6e"
|
resolved "https://registry.yarnpkg.com/@hapi/boom/-/boom-9.1.4.tgz#1f9dad367c6a7da9f8def24b4a986fc5a7bd9db6"
|
||||||
integrity sha512-RlrGyZ603hE/eRTZtTltocRm50HHmrmL3kGOP0SQ9MasazlW1mt/fkv4C5P/6rnpFXjwld/POFX1C8tMZE3ldg==
|
integrity sha512-Ls1oH8jaN1vNsqcaHVYJrKmgMcKsC1wcp8bujvXrHaAqD2iDYq3HoOwsxwo09Cuda5R5nC0o0IxlrlTuvPuzSw==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@hapi/hoek" "9.x.x"
|
"@hapi/hoek" "9.x.x"
|
||||||
|
|
||||||
|
@ -179,34 +181,34 @@
|
||||||
dependencies:
|
dependencies:
|
||||||
axios "^0.19.2"
|
axios "^0.19.2"
|
||||||
|
|
||||||
"@stripe/react-stripe-js@1.4.1":
|
"@stripe/react-stripe-js@1.5.0":
|
||||||
version "1.4.1"
|
version "1.5.0"
|
||||||
resolved "https://registry.yarnpkg.com/@stripe/react-stripe-js/-/react-stripe-js-1.4.1.tgz#884d59286fff00ba77389b32c045516f65d7a340"
|
resolved "https://registry.yarnpkg.com/@stripe/react-stripe-js/-/react-stripe-js-1.5.0.tgz#7e4d80077e88e1f2c1f10ac255f2838d7c9488c2"
|
||||||
integrity sha512-FjcVrhf72+9fUL3Lz3xi02ni9tzH1A1x6elXlr6tvBDgSD55oPJuodoP8eC7xTnBIKq0olF5uJvgtkJyDCdzjA==
|
integrity sha512-A7+bNeb0O/kw3JdtMeiB6frokPcks5obi+TIjuFRXUMZ5o/o1Qe7eLgLnsb0KOO/g3KJqNCpHiYcKCLESZJJbQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
prop-types "^15.7.2"
|
prop-types "^15.7.2"
|
||||||
|
|
||||||
"@stripe/stripe-js@1.17.1":
|
"@stripe/stripe-js@1.19.1":
|
||||||
version "1.17.1"
|
version "1.19.1"
|
||||||
resolved "https://registry.yarnpkg.com/@stripe/stripe-js/-/stripe-js-1.17.1.tgz#afcb7e86d0b05d1a7af53af89111abd2e8d437ae"
|
resolved "https://registry.yarnpkg.com/@stripe/stripe-js/-/stripe-js-1.19.1.tgz#51017bb1c6e12f0e74747534667e42e77b2c9978"
|
||||||
integrity sha512-c9MyDvdi5Xou0j0JPNy86NebtTDfh9o62Ifuzx6GSm2YO0oedBpy51WSyOue2L8Fb+mqESS5gd6mGVEIPUnXsA==
|
integrity sha512-gvaQ51FXHHKMypXMlSPZbpb7e5671oqySqEfU2MviAQCsikV/+vnvPPxOged4RvNwNM7v4ocsKadQwqIwPhgrQ==
|
||||||
|
|
||||||
"@tailwindcss/forms@0.3.3":
|
"@tailwindcss/forms@0.3.4":
|
||||||
version "0.3.3"
|
version "0.3.4"
|
||||||
resolved "https://registry.yarnpkg.com/@tailwindcss/forms/-/forms-0.3.3.tgz#a29d22668804f3dae293dcadbef1aa6315c45b64"
|
resolved "https://registry.yarnpkg.com/@tailwindcss/forms/-/forms-0.3.4.tgz#e4939dc16450eccf4fd2029770096f38cbb556d4"
|
||||||
integrity sha512-U8Fi/gq4mSuaLyLtFISwuDYzPB73YzgozjxOIHsK6NXgg/IWD1FLaHbFlWmurAMyy98O+ao74ksdQefsquBV1Q==
|
integrity sha512-vlAoBifNJUkagB+PAdW4aHMe4pKmSLroH398UPgIogBFc91D2VlHUxe4pjxQhiJl0Nfw53sHSJSQBSTQBZP3vA==
|
||||||
dependencies:
|
dependencies:
|
||||||
mini-svg-data-uri "^1.2.3"
|
mini-svg-data-uri "^1.2.3"
|
||||||
|
|
||||||
"@types/lodash@^4.14.165":
|
"@types/lodash@^4.14.165":
|
||||||
version "4.14.171"
|
version "4.14.174"
|
||||||
resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.171.tgz#f01b3a5fe3499e34b622c362a46a609fdb23573b"
|
resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.174.tgz#b4b06b6eced9850eed6b6a8f1abdd0f5192803c1"
|
||||||
integrity sha512-7eQ2xYLLI/LsicL2nejW9Wyko3lcpN6O/z0ZLHrEQsg280zIdCv1t/0m6UtBjUHokCGBQ3gYTbHzDkZ1xOBwwg==
|
integrity sha512-KMBLT6+g9qrGXpDt7ohjWPUD34WA/jasrtjTEHStF0NPdEwJ1N9SZ+4GaMVDeuk/y0+X5j9xFm6mNiXS7UoaLQ==
|
||||||
|
|
||||||
"@types/node@*", "@types/node@>=8.1.0":
|
"@types/node@*", "@types/node@>=8.1.0":
|
||||||
version "16.4.3"
|
version "16.10.1"
|
||||||
resolved "https://registry.yarnpkg.com/@types/node/-/node-16.4.3.tgz#c01c1a215721f6dec71b47d88b4687463601ba48"
|
resolved "https://registry.yarnpkg.com/@types/node/-/node-16.10.1.tgz#f3647623199ca920960006b3dccf633ea905f243"
|
||||||
integrity sha512-GKM4FLMkWDc0sfx7tXqPWkM6NBow1kge0fgQh0bOnlqo4iT1kvTvMEKE0c1RtUGnbLlGRXiAA8SumE//90uKAg==
|
integrity sha512-4/Z9DMPKFexZj/Gn3LylFgamNKHm4K3QDi0gz9B26Uk0c8izYf97B5fxfpspMNkWlFupblKM/nV8+NA9Ffvr+w==
|
||||||
|
|
||||||
"@types/parse-json@^4.0.0":
|
"@types/parse-json@^4.0.0":
|
||||||
version "4.0.0"
|
version "4.0.0"
|
||||||
|
@ -238,9 +240,9 @@ anser@1.4.9:
|
||||||
integrity sha512-AI+BjTeGt2+WFk4eWcqbQ7snZpDBt8SaLlj0RT2h5xfdWaiy51OjYvqwMrNzJLGy8iOAL6nKDITWO+rd4MkYEA==
|
integrity sha512-AI+BjTeGt2+WFk4eWcqbQ7snZpDBt8SaLlj0RT2h5xfdWaiy51OjYvqwMrNzJLGy8iOAL6nKDITWO+rd4MkYEA==
|
||||||
|
|
||||||
ansi-regex@^5.0.0:
|
ansi-regex@^5.0.0:
|
||||||
version "5.0.0"
|
version "5.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75"
|
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
|
||||||
integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==
|
integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
|
||||||
|
|
||||||
ansi-styles@^3.2.1:
|
ansi-styles@^3.2.1:
|
||||||
version "3.2.1"
|
version "3.2.1"
|
||||||
|
@ -317,36 +319,29 @@ asynckit@^0.4.0:
|
||||||
resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
|
resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
|
||||||
integrity sha1-x57Zf380y48robyXkLzDZkdLS3k=
|
integrity sha1-x57Zf380y48robyXkLzDZkdLS3k=
|
||||||
|
|
||||||
autoprefixer@10.3.4:
|
autoprefixer@10.3.7:
|
||||||
version "10.3.4"
|
version "10.3.7"
|
||||||
resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.3.4.tgz#29efe5d19f51c281953178ddb5b84c5f1ca24c86"
|
resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.3.7.tgz#cef2562058406bd378c94aacda36bb46a97b3186"
|
||||||
integrity sha512-EKjKDXOq7ug+jagLzmnoTRpTT0q1KVzEJqrJd0hCBa7FiG0WbFOBCcJCy2QkW1OckpO3qgttA1aWjVbeIPAecw==
|
integrity sha512-EmGpu0nnQVmMhX8ROoJ7Mx8mKYPlcUHuxkwrRYEYMz85lu7H09v8w6R1P0JPdn/hKU32GjpLBFEOuIlDWCRWvg==
|
||||||
dependencies:
|
dependencies:
|
||||||
browserslist "^4.16.8"
|
browserslist "^4.17.3"
|
||||||
caniuse-lite "^1.0.30001252"
|
caniuse-lite "^1.0.30001264"
|
||||||
colorette "^1.3.0"
|
|
||||||
fraction.js "^4.1.1"
|
fraction.js "^4.1.1"
|
||||||
normalize-range "^0.1.2"
|
normalize-range "^0.1.2"
|
||||||
|
picocolors "^0.2.1"
|
||||||
postcss-value-parser "^4.1.0"
|
postcss-value-parser "^4.1.0"
|
||||||
|
|
||||||
available-typed-arrays@^1.0.2:
|
available-typed-arrays@^1.0.5:
|
||||||
version "1.0.4"
|
version "1.0.5"
|
||||||
resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.4.tgz#9e0ae84ecff20caae6a94a1c3bc39b955649b7a9"
|
resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7"
|
||||||
integrity sha512-SA5mXJWrId1TaQjfxUYghbqQ/hYioKmLJvPJyDuYRtXXenFNMjj4hSSt1Cf1xsuXSXrtxrVC5Ot4eU6cOtBDdA==
|
integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==
|
||||||
|
|
||||||
axios@^0.19.2:
|
axios@0.21.4, axios@^0.19.2, axios@^0.21.0:
|
||||||
version "0.19.2"
|
version "0.21.4"
|
||||||
resolved "https://registry.yarnpkg.com/axios/-/axios-0.19.2.tgz#3ea36c5d8818d0d5f8a8a97a6d36b86cdc00cb27"
|
resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575"
|
||||||
integrity sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==
|
integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==
|
||||||
dependencies:
|
dependencies:
|
||||||
follow-redirects "1.5.10"
|
follow-redirects "^1.14.0"
|
||||||
|
|
||||||
axios@^0.21.0:
|
|
||||||
version "0.21.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.1.tgz#22563481962f4d6bde9a76d516ef0e5d3c09b2b8"
|
|
||||||
integrity sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==
|
|
||||||
dependencies:
|
|
||||||
follow-redirects "^1.10.0"
|
|
||||||
|
|
||||||
balanced-match@^1.0.0:
|
balanced-match@^1.0.0:
|
||||||
version "1.0.2"
|
version "1.0.2"
|
||||||
|
@ -482,16 +477,16 @@ browserslist@4.16.6:
|
||||||
escalade "^3.1.1"
|
escalade "^3.1.1"
|
||||||
node-releases "^1.1.71"
|
node-releases "^1.1.71"
|
||||||
|
|
||||||
browserslist@^4.16.8:
|
browserslist@^4.17.3:
|
||||||
version "4.16.8"
|
version "4.17.3"
|
||||||
resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.8.tgz#cb868b0b554f137ba6e33de0ecff2eda403c4fb0"
|
resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.17.3.tgz#2844cd6eebe14d12384b0122d217550160d2d624"
|
||||||
integrity sha512-sc2m9ohR/49sWEbPj14ZSSZqp+kbi16aLao42Hmn3Z8FpjuMaq2xCA2l4zl9ITfyzvnvyE0hcg62YkIGKxgaNQ==
|
integrity sha512-59IqHJV5VGdcJZ+GZ2hU5n4Kv3YiASzW6Xk5g9tf5a/MAzGeFwgGWU39fVzNIOVcgB3+Gp+kiQu0HEfTVU/3VQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
caniuse-lite "^1.0.30001251"
|
caniuse-lite "^1.0.30001264"
|
||||||
colorette "^1.3.0"
|
electron-to-chromium "^1.3.857"
|
||||||
electron-to-chromium "^1.3.811"
|
|
||||||
escalade "^3.1.1"
|
escalade "^3.1.1"
|
||||||
node-releases "^1.1.75"
|
node-releases "^1.1.77"
|
||||||
|
picocolors "^0.2.1"
|
||||||
|
|
||||||
buffer-equal-constant-time@1.0.1:
|
buffer-equal-constant-time@1.0.1:
|
||||||
version "1.0.1"
|
version "1.0.1"
|
||||||
|
@ -556,10 +551,10 @@ camelcase-css@^2.0.1:
|
||||||
resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5"
|
resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5"
|
||||||
integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==
|
integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==
|
||||||
|
|
||||||
caniuse-lite@^1.0.30001202, caniuse-lite@^1.0.30001219, caniuse-lite@^1.0.30001228, caniuse-lite@^1.0.30001251, caniuse-lite@^1.0.30001252:
|
caniuse-lite@^1.0.30001202, caniuse-lite@^1.0.30001219, caniuse-lite@^1.0.30001228, caniuse-lite@^1.0.30001264:
|
||||||
version "1.0.30001252"
|
version "1.0.30001265"
|
||||||
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001252.tgz#cb16e4e3dafe948fc4a9bb3307aea054b912019a"
|
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001265.tgz#0613c9e6c922e422792e6fcefdf9a3afeee4f8c3"
|
||||||
integrity sha512-I56jhWDGMtdILQORdusxBOH+Nl/KgQSdDmpJezYddnAkVOmnoU8zwjTV9xAjMIYxr0iPreEAVylCGcmHCjfaOw==
|
integrity sha512-YzBnspggWV5hep1m9Z6sZVLOt7vrju8xWooFAgN6BA5qvy98qPAPb7vNUzypFaoh2pb3vlfzbDO8tB57UPGbtw==
|
||||||
|
|
||||||
chalk@2.4.2, chalk@^2.0.0:
|
chalk@2.4.2, chalk@^2.0.0:
|
||||||
version "2.4.2"
|
version "2.4.2"
|
||||||
|
@ -643,6 +638,11 @@ clipboardy@2.3.0:
|
||||||
execa "^1.0.0"
|
execa "^1.0.0"
|
||||||
is-wsl "^2.1.1"
|
is-wsl "^2.1.1"
|
||||||
|
|
||||||
|
clsx@^1.1.1:
|
||||||
|
version "1.1.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.1.1.tgz#98b3134f9abbdf23b2663491ace13c5c03a73188"
|
||||||
|
integrity sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==
|
||||||
|
|
||||||
color-convert@^1.9.0:
|
color-convert@^1.9.0:
|
||||||
version "1.9.3"
|
version "1.9.3"
|
||||||
resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
|
resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
|
||||||
|
@ -683,10 +683,10 @@ color@^4.0.1:
|
||||||
color-convert "^2.0.1"
|
color-convert "^2.0.1"
|
||||||
color-string "^1.6.0"
|
color-string "^1.6.0"
|
||||||
|
|
||||||
colorette@^1.2.2, colorette@^1.3.0:
|
colorette@^1.2.2:
|
||||||
version "1.3.0"
|
version "1.4.0"
|
||||||
resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.3.0.tgz#ff45d2f0edb244069d3b772adeb04fed38d0a0af"
|
resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.4.0.tgz#5190fbb87276259a86ad700bff2c6d6faa3fca40"
|
||||||
integrity sha512-ecORCqbSFP7Wm8Y6lyqMJjexBQqXSF7SSeaTyGGphogUjBlFP9m9o08wy86HL2uB7fMTxtOUzLMk7ogKcxMg1w==
|
integrity sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==
|
||||||
|
|
||||||
combined-stream@^1.0.8:
|
combined-stream@^1.0.8:
|
||||||
version "1.0.8"
|
version "1.0.8"
|
||||||
|
@ -738,9 +738,9 @@ cookiejar@^2.1.2:
|
||||||
integrity sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==
|
integrity sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==
|
||||||
|
|
||||||
core-util-is@~1.0.0:
|
core-util-is@~1.0.0:
|
||||||
version "1.0.2"
|
version "1.0.3"
|
||||||
resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
|
resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85"
|
||||||
integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
|
integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==
|
||||||
|
|
||||||
cosmiconfig@^7.0.1:
|
cosmiconfig@^7.0.1:
|
||||||
version "7.0.1"
|
version "7.0.1"
|
||||||
|
@ -863,13 +863,6 @@ debug@2:
|
||||||
dependencies:
|
dependencies:
|
||||||
ms "2.0.0"
|
ms "2.0.0"
|
||||||
|
|
||||||
debug@=3.1.0:
|
|
||||||
version "3.1.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
|
|
||||||
integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==
|
|
||||||
dependencies:
|
|
||||||
ms "2.0.0"
|
|
||||||
|
|
||||||
debug@^4.1.1:
|
debug@^4.1.1:
|
||||||
version "4.3.2"
|
version "4.3.2"
|
||||||
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b"
|
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b"
|
||||||
|
@ -963,14 +956,14 @@ ecdsa-sig-formatter@1.0.11:
|
||||||
safe-buffer "^5.0.1"
|
safe-buffer "^5.0.1"
|
||||||
|
|
||||||
electron-to-chromium@^1.3.723:
|
electron-to-chromium@^1.3.723:
|
||||||
version "1.3.786"
|
version "1.3.850"
|
||||||
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.786.tgz#1fc572abc77e2f474725f8a61acf7e25ced9fbe2"
|
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.850.tgz#c56c72abfeab051b4b328beb894461c5912d0456"
|
||||||
integrity sha512-AmvbLBj3hepRk8v/DHrFF8gINxOFfDbrn6Ts3PcK46/FBdQb5OMmpamSpZQXSkfi77FfBzYtQtAk+00LCLYMVw==
|
integrity sha512-ZzkDcdzePeF4dhoGZQT77V2CyJOpwfTZEOg4h0x6R/jQhGt/rIRpbRyVreWLtD7B/WsVxo91URm2WxMKR9JQZA==
|
||||||
|
|
||||||
electron-to-chromium@^1.3.811:
|
electron-to-chromium@^1.3.857:
|
||||||
version "1.3.814"
|
version "1.3.864"
|
||||||
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.814.tgz#418fad80c3276a46103ca72a21a8290620d83c4a"
|
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.864.tgz#6a993bcc196a2b8b3df84d28d5d4dd912393885f"
|
||||||
integrity sha512-0mH03cyjh6OzMlmjauGg0TLd87ErIJqWiYxMcOLKf5w6p0YEOl7DJAj7BDlXEFmCguY5CQaKVOiMjAMODO2XDw==
|
integrity sha512-v4rbad8GO6/yVI92WOeU9Wgxc4NA0n4f6P1FvZTY+jyY7JHEhw3bduYu60v3Q1h81Cg6eo4ApZrFPuycwd5hGw==
|
||||||
|
|
||||||
elliptic@^6.5.3:
|
elliptic@^6.5.3:
|
||||||
version "6.5.4"
|
version "6.5.4"
|
||||||
|
@ -1011,22 +1004,24 @@ error-ex@^1.3.1:
|
||||||
dependencies:
|
dependencies:
|
||||||
is-arrayish "^0.2.1"
|
is-arrayish "^0.2.1"
|
||||||
|
|
||||||
es-abstract@^1.18.0-next.1, es-abstract@^1.18.0-next.2:
|
es-abstract@^1.18.5:
|
||||||
version "1.18.3"
|
version "1.18.6"
|
||||||
resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.3.tgz#25c4c3380a27aa203c44b2b685bba94da31b63e0"
|
resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.6.tgz#2c44e3ea7a6255039164d26559777a6d978cb456"
|
||||||
integrity sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw==
|
integrity sha512-kAeIT4cku5eNLNuUKhlmtuk1/TRZvQoYccn6TO0cSVdf1kzB0T7+dYuVK9MWM7l+/53W2Q8M7N2c6MQvhXFcUQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
call-bind "^1.0.2"
|
call-bind "^1.0.2"
|
||||||
es-to-primitive "^1.2.1"
|
es-to-primitive "^1.2.1"
|
||||||
function-bind "^1.1.1"
|
function-bind "^1.1.1"
|
||||||
get-intrinsic "^1.1.1"
|
get-intrinsic "^1.1.1"
|
||||||
|
get-symbol-description "^1.0.0"
|
||||||
has "^1.0.3"
|
has "^1.0.3"
|
||||||
has-symbols "^1.0.2"
|
has-symbols "^1.0.2"
|
||||||
is-callable "^1.2.3"
|
internal-slot "^1.0.3"
|
||||||
|
is-callable "^1.2.4"
|
||||||
is-negative-zero "^2.0.1"
|
is-negative-zero "^2.0.1"
|
||||||
is-regex "^1.1.3"
|
is-regex "^1.1.4"
|
||||||
is-string "^1.0.6"
|
is-string "^1.0.7"
|
||||||
object-inspect "^1.10.3"
|
object-inspect "^1.11.0"
|
||||||
object-keys "^1.1.1"
|
object-keys "^1.1.1"
|
||||||
object.assign "^4.1.2"
|
object.assign "^4.1.2"
|
||||||
string.prototype.trimend "^1.0.4"
|
string.prototype.trimend "^1.0.4"
|
||||||
|
@ -1122,9 +1117,9 @@ fast-levenshtein@3.0.0:
|
||||||
fastest-levenshtein "^1.0.7"
|
fastest-levenshtein "^1.0.7"
|
||||||
|
|
||||||
fast-safe-stringify@^2.0.7:
|
fast-safe-stringify@^2.0.7:
|
||||||
version "2.0.8"
|
version "2.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.0.8.tgz#dc2af48c46cf712b683e849b2bbd446b32de936f"
|
resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884"
|
||||||
integrity sha512-lXatBjf3WPjmWD6DpIZxkeSsCOwqI0maYMpgDlx8g4U2qi4lbjA9oH/HD2a87G+KfsUmo5WbJFmqBZlPxtptag==
|
integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==
|
||||||
|
|
||||||
fastest-levenshtein@^1.0.7:
|
fastest-levenshtein@^1.0.7:
|
||||||
version "1.0.12"
|
version "1.0.12"
|
||||||
|
@ -1132,9 +1127,9 @@ fastest-levenshtein@^1.0.7:
|
||||||
integrity sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==
|
integrity sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==
|
||||||
|
|
||||||
fastq@^1.6.0:
|
fastq@^1.6.0:
|
||||||
version "1.11.1"
|
version "1.13.0"
|
||||||
resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.11.1.tgz#5d8175aae17db61947f8b162cfc7f63264d22807"
|
resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c"
|
||||||
integrity sha512-HOnr8Mc60eNYl1gzwp6r5RoUyAn5/glBolUzP/Ez6IFVPMPirxn/9phgL6zhOtaTy7ISwPvQ+wT+hfcRZh/bzw==
|
integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==
|
||||||
dependencies:
|
dependencies:
|
||||||
reusify "^1.0.4"
|
reusify "^1.0.4"
|
||||||
|
|
||||||
|
@ -1162,17 +1157,10 @@ find-up@^4.0.0:
|
||||||
locate-path "^5.0.0"
|
locate-path "^5.0.0"
|
||||||
path-exists "^4.0.0"
|
path-exists "^4.0.0"
|
||||||
|
|
||||||
follow-redirects@1.5.10:
|
follow-redirects@^1.14.0:
|
||||||
version "1.5.10"
|
version "1.14.4"
|
||||||
resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.10.tgz#7b7a9f9aea2fdff36786a94ff643ed07f4ff5e2a"
|
resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.4.tgz#838fdf48a8bbdd79e52ee51fb1c94e3ed98b9379"
|
||||||
integrity sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==
|
integrity sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g==
|
||||||
dependencies:
|
|
||||||
debug "=3.1.0"
|
|
||||||
|
|
||||||
follow-redirects@^1.10.0:
|
|
||||||
version "1.14.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.1.tgz#d9114ded0a1cfdd334e164e6662ad02bfd91ff43"
|
|
||||||
integrity sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg==
|
|
||||||
|
|
||||||
foreach@^2.0.5:
|
foreach@^2.0.5:
|
||||||
version "2.0.5"
|
version "2.0.5"
|
||||||
|
@ -1235,7 +1223,7 @@ function-bind@^1.1.1:
|
||||||
resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
|
resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
|
||||||
integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
|
integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
|
||||||
|
|
||||||
get-intrinsic@^1.0.2, get-intrinsic@^1.1.1:
|
get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1:
|
||||||
version "1.1.1"
|
version "1.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6"
|
resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6"
|
||||||
integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==
|
integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==
|
||||||
|
@ -1258,6 +1246,14 @@ get-stream@^4.0.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
pump "^3.0.0"
|
pump "^3.0.0"
|
||||||
|
|
||||||
|
get-symbol-description@^1.0.0:
|
||||||
|
version "1.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6"
|
||||||
|
integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==
|
||||||
|
dependencies:
|
||||||
|
call-bind "^1.0.2"
|
||||||
|
get-intrinsic "^1.1.1"
|
||||||
|
|
||||||
glob-parent@^5.1.2, glob-parent@~5.1.0, glob-parent@~5.1.2:
|
glob-parent@^5.1.2, glob-parent@~5.1.0, glob-parent@~5.1.2:
|
||||||
version "5.1.2"
|
version "5.1.2"
|
||||||
resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
|
resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
|
||||||
|
@ -1278,9 +1274,9 @@ glob-to-regexp@^0.4.1:
|
||||||
integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==
|
integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==
|
||||||
|
|
||||||
glob@^7.0.0, glob@^7.1.3:
|
glob@^7.0.0, glob@^7.1.3:
|
||||||
version "7.1.7"
|
version "7.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90"
|
resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023"
|
||||||
integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==
|
integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==
|
||||||
dependencies:
|
dependencies:
|
||||||
fs.realpath "^1.0.0"
|
fs.realpath "^1.0.0"
|
||||||
inflight "^1.0.4"
|
inflight "^1.0.4"
|
||||||
|
@ -1290,9 +1286,9 @@ glob@^7.0.0, glob@^7.1.3:
|
||||||
path-is-absolute "^1.0.0"
|
path-is-absolute "^1.0.0"
|
||||||
|
|
||||||
graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0:
|
graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0:
|
||||||
version "4.2.6"
|
version "4.2.8"
|
||||||
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee"
|
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a"
|
||||||
integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==
|
integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==
|
||||||
|
|
||||||
has-bigints@^1.0.1:
|
has-bigints@^1.0.1:
|
||||||
version "1.0.1"
|
version "1.0.1"
|
||||||
|
@ -1314,6 +1310,13 @@ has-symbols@^1.0.1, has-symbols@^1.0.2:
|
||||||
resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423"
|
resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423"
|
||||||
integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==
|
integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==
|
||||||
|
|
||||||
|
has-tostringtag@^1.0.0:
|
||||||
|
version "1.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25"
|
||||||
|
integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==
|
||||||
|
dependencies:
|
||||||
|
has-symbols "^1.0.2"
|
||||||
|
|
||||||
has@^1.0.3:
|
has@^1.0.3:
|
||||||
version "1.0.3"
|
version "1.0.3"
|
||||||
resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
|
resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
|
||||||
|
@ -1471,12 +1474,22 @@ inherits@2.0.3:
|
||||||
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
|
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
|
||||||
integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
|
integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
|
||||||
|
|
||||||
is-arguments@^1.0.4:
|
internal-slot@^1.0.3:
|
||||||
version "1.1.0"
|
version "1.0.3"
|
||||||
resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.0.tgz#62353031dfbee07ceb34656a6bde59efecae8dd9"
|
resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c"
|
||||||
integrity sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==
|
integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==
|
||||||
dependencies:
|
dependencies:
|
||||||
call-bind "^1.0.0"
|
get-intrinsic "^1.1.0"
|
||||||
|
has "^1.0.3"
|
||||||
|
side-channel "^1.0.4"
|
||||||
|
|
||||||
|
is-arguments@^1.0.4:
|
||||||
|
version "1.1.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b"
|
||||||
|
integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==
|
||||||
|
dependencies:
|
||||||
|
call-bind "^1.0.2"
|
||||||
|
has-tostringtag "^1.0.0"
|
||||||
|
|
||||||
is-arrayish@^0.2.1:
|
is-arrayish@^0.2.1:
|
||||||
version "0.2.1"
|
version "0.2.1"
|
||||||
|
@ -1489,9 +1502,11 @@ is-arrayish@^0.3.1:
|
||||||
integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==
|
integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==
|
||||||
|
|
||||||
is-bigint@^1.0.1:
|
is-bigint@^1.0.1:
|
||||||
version "1.0.2"
|
version "1.0.4"
|
||||||
resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.2.tgz#ffb381442503235ad245ea89e45b3dbff040ee5a"
|
resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3"
|
||||||
integrity sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==
|
integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==
|
||||||
|
dependencies:
|
||||||
|
has-bigints "^1.0.1"
|
||||||
|
|
||||||
is-binary-path@~2.1.0:
|
is-binary-path@~2.1.0:
|
||||||
version "2.1.0"
|
version "2.1.0"
|
||||||
|
@ -1501,16 +1516,17 @@ is-binary-path@~2.1.0:
|
||||||
binary-extensions "^2.0.0"
|
binary-extensions "^2.0.0"
|
||||||
|
|
||||||
is-boolean-object@^1.1.0:
|
is-boolean-object@^1.1.0:
|
||||||
version "1.1.1"
|
version "1.1.2"
|
||||||
resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.1.tgz#3c0878f035cb821228d350d2e1e36719716a3de8"
|
resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719"
|
||||||
integrity sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==
|
integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==
|
||||||
dependencies:
|
dependencies:
|
||||||
call-bind "^1.0.2"
|
call-bind "^1.0.2"
|
||||||
|
has-tostringtag "^1.0.0"
|
||||||
|
|
||||||
is-callable@^1.1.4, is-callable@^1.2.3:
|
is-callable@^1.1.4, is-callable@^1.2.4:
|
||||||
version "1.2.3"
|
version "1.2.4"
|
||||||
resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.3.tgz#8b1e0500b73a1d76c70487636f368e519de8db8e"
|
resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945"
|
||||||
integrity sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==
|
integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==
|
||||||
|
|
||||||
is-color-stop@^1.1.0:
|
is-color-stop@^1.1.0:
|
||||||
version "1.1.0"
|
version "1.1.0"
|
||||||
|
@ -1525,16 +1541,18 @@ is-color-stop@^1.1.0:
|
||||||
rgba-regex "^1.0.0"
|
rgba-regex "^1.0.0"
|
||||||
|
|
||||||
is-core-module@^2.2.0:
|
is-core-module@^2.2.0:
|
||||||
version "2.5.0"
|
version "2.7.0"
|
||||||
resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.5.0.tgz#f754843617c70bfd29b7bd87327400cda5c18491"
|
resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.7.0.tgz#3c0ef7d31b4acfc574f80c58409d568a836848e3"
|
||||||
integrity sha512-TXCMSDsEHMEEZ6eCA8rwRDbLu55MRGmrctljsBX/2v1d9/GzqHOxW5c5oPSgrUt2vBFXebu9rGqckXGPWOlYpg==
|
integrity sha512-ByY+tjCciCr+9nLryBYcSD50EOGWt95c7tIsKTG1J2ixKKXPvF7Ej3AVd+UfDydAJom3biBGDBALaO79ktwgEQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
has "^1.0.3"
|
has "^1.0.3"
|
||||||
|
|
||||||
is-date-object@^1.0.1:
|
is-date-object@^1.0.1:
|
||||||
version "1.0.4"
|
version "1.0.5"
|
||||||
resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.4.tgz#550cfcc03afada05eea3dd30981c7b09551f73e5"
|
resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f"
|
||||||
integrity sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==
|
integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==
|
||||||
|
dependencies:
|
||||||
|
has-tostringtag "^1.0.0"
|
||||||
|
|
||||||
is-docker@^2.0.0:
|
is-docker@^2.0.0:
|
||||||
version "2.2.1"
|
version "2.2.1"
|
||||||
|
@ -1547,14 +1565,16 @@ is-extglob@^2.1.1:
|
||||||
integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
|
integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
|
||||||
|
|
||||||
is-generator-function@^1.0.7:
|
is-generator-function@^1.0.7:
|
||||||
version "1.0.9"
|
version "1.0.10"
|
||||||
resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.9.tgz#e5f82c2323673e7fcad3d12858c83c4039f6399c"
|
resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72"
|
||||||
integrity sha512-ZJ34p1uvIfptHCN7sFTjGibB9/oBg17sHqzDLfuwhvmN/qLVvIQXRQ8licZQ35WJ8KuEQt/etnnzQFI9C9Ue/A==
|
integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==
|
||||||
|
dependencies:
|
||||||
|
has-tostringtag "^1.0.0"
|
||||||
|
|
||||||
is-glob@^4.0.1, is-glob@~4.0.1:
|
is-glob@^4.0.1, is-glob@~4.0.1:
|
||||||
version "4.0.1"
|
version "4.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc"
|
resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.2.tgz#859fc2e731e58c902f99fcabccb75a7dd07d29d8"
|
||||||
integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==
|
integrity sha512-ZZTOjRcDjuAAAv2cTBQP/lL59ZTArx77+7UzHdWW/XB1mrfp7DEaVpKmZ0XIzx+M7AxfhKcqV+nMetUQmFifwg==
|
||||||
dependencies:
|
dependencies:
|
||||||
is-extglob "^2.1.1"
|
is-extglob "^2.1.1"
|
||||||
|
|
||||||
|
@ -1572,32 +1592,36 @@ is-negative-zero@^2.0.1:
|
||||||
integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==
|
integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==
|
||||||
|
|
||||||
is-number-object@^1.0.4:
|
is-number-object@^1.0.4:
|
||||||
version "1.0.5"
|
version "1.0.6"
|
||||||
resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.5.tgz#6edfaeed7950cff19afedce9fbfca9ee6dd289eb"
|
resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.6.tgz#6a7aaf838c7f0686a50b4553f7e54a96494e89f0"
|
||||||
integrity sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==
|
integrity sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==
|
||||||
|
dependencies:
|
||||||
|
has-tostringtag "^1.0.0"
|
||||||
|
|
||||||
is-number@^7.0.0:
|
is-number@^7.0.0:
|
||||||
version "7.0.0"
|
version "7.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
|
resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
|
||||||
integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
|
integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
|
||||||
|
|
||||||
is-regex@^1.1.3:
|
is-regex@^1.1.4:
|
||||||
version "1.1.3"
|
version "1.1.4"
|
||||||
resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.3.tgz#d029f9aff6448b93ebbe3f33dac71511fdcbef9f"
|
resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958"
|
||||||
integrity sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==
|
integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==
|
||||||
dependencies:
|
dependencies:
|
||||||
call-bind "^1.0.2"
|
call-bind "^1.0.2"
|
||||||
has-symbols "^1.0.2"
|
has-tostringtag "^1.0.0"
|
||||||
|
|
||||||
is-stream@^1.1.0:
|
is-stream@^1.1.0:
|
||||||
version "1.1.0"
|
version "1.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
|
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
|
||||||
integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ=
|
integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ=
|
||||||
|
|
||||||
is-string@^1.0.5, is-string@^1.0.6:
|
is-string@^1.0.5, is-string@^1.0.7:
|
||||||
version "1.0.6"
|
version "1.0.7"
|
||||||
resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.6.tgz#3fe5d5992fb0d93404f32584d4b0179a71b54a5f"
|
resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd"
|
||||||
integrity sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==
|
integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==
|
||||||
|
dependencies:
|
||||||
|
has-tostringtag "^1.0.0"
|
||||||
|
|
||||||
is-symbol@^1.0.2, is-symbol@^1.0.3:
|
is-symbol@^1.0.2, is-symbol@^1.0.3:
|
||||||
version "1.0.4"
|
version "1.0.4"
|
||||||
|
@ -1606,16 +1630,16 @@ is-symbol@^1.0.2, is-symbol@^1.0.3:
|
||||||
dependencies:
|
dependencies:
|
||||||
has-symbols "^1.0.2"
|
has-symbols "^1.0.2"
|
||||||
|
|
||||||
is-typed-array@^1.1.3:
|
is-typed-array@^1.1.3, is-typed-array@^1.1.7:
|
||||||
version "1.1.5"
|
version "1.1.8"
|
||||||
resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.5.tgz#f32e6e096455e329eb7b423862456aa213f0eb4e"
|
resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.8.tgz#cbaa6585dc7db43318bc5b89523ea384a6f65e79"
|
||||||
integrity sha512-S+GRDgJlR3PyEbsX/Fobd9cqpZBuvUS+8asRqYDMLCb2qMzt1oz5m5oxQCxOgUDxiWsOVNi4yaF+/uvdlHlYug==
|
integrity sha512-HqH41TNZq2fgtGT8WHVFVJhBVGuY3AnP3Q36K8JKXUxSxRgk/d+7NjmwG2vo2mYmXK8UYZKu0qH8bVP5gEisjA==
|
||||||
dependencies:
|
dependencies:
|
||||||
available-typed-arrays "^1.0.2"
|
available-typed-arrays "^1.0.5"
|
||||||
call-bind "^1.0.2"
|
call-bind "^1.0.2"
|
||||||
es-abstract "^1.18.0-next.2"
|
es-abstract "^1.18.5"
|
||||||
foreach "^2.0.5"
|
foreach "^2.0.5"
|
||||||
has-symbols "^1.0.1"
|
has-tostringtag "^1.0.0"
|
||||||
|
|
||||||
is-wsl@^2.1.1:
|
is-wsl@^2.1.1:
|
||||||
version "2.2.0"
|
version "2.2.0"
|
||||||
|
@ -1854,17 +1878,17 @@ miller-rabin@^4.0.0:
|
||||||
bn.js "^4.0.0"
|
bn.js "^4.0.0"
|
||||||
brorand "^1.0.1"
|
brorand "^1.0.1"
|
||||||
|
|
||||||
mime-db@1.48.0:
|
mime-db@1.49.0:
|
||||||
version "1.48.0"
|
version "1.49.0"
|
||||||
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.48.0.tgz#e35b31045dd7eada3aaad537ed88a33afbef2d1d"
|
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.49.0.tgz#f3dfde60c99e9cf3bc9701d687778f537001cbed"
|
||||||
integrity sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==
|
integrity sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==
|
||||||
|
|
||||||
mime-types@^2.1.12:
|
mime-types@^2.1.12:
|
||||||
version "2.1.31"
|
version "2.1.32"
|
||||||
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.31.tgz#a00d76b74317c61f9c2db2218b8e9f8e9c5c9e6b"
|
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.32.tgz#1d00e89e7de7fe02008db61001d9e02852670fd5"
|
||||||
integrity sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==
|
integrity sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==
|
||||||
dependencies:
|
dependencies:
|
||||||
mime-db "1.48.0"
|
mime-db "1.49.0"
|
||||||
|
|
||||||
mime@^2.4.6, mime@^2.5.2:
|
mime@^2.4.6, mime@^2.5.2:
|
||||||
version "2.5.2"
|
version "2.5.2"
|
||||||
|
@ -1923,10 +1947,10 @@ nanoclone@^0.2.1:
|
||||||
resolved "https://registry.yarnpkg.com/nanoclone/-/nanoclone-0.2.1.tgz#dd4090f8f1a110d26bb32c49ed2f5b9235209ed4"
|
resolved "https://registry.yarnpkg.com/nanoclone/-/nanoclone-0.2.1.tgz#dd4090f8f1a110d26bb32c49ed2f5b9235209ed4"
|
||||||
integrity sha512-wynEP02LmIbLpcYw8uBKpcfF6dmg2vcpKqxeH5UcoKEYdExslsdUA4ugFauuaeYdTB76ez6gJW8XAZ6CgkXYxA==
|
integrity sha512-wynEP02LmIbLpcYw8uBKpcfF6dmg2vcpKqxeH5UcoKEYdExslsdUA4ugFauuaeYdTB76ez6gJW8XAZ6CgkXYxA==
|
||||||
|
|
||||||
nanoid@^3.1.23:
|
nanoid@^3.1.23, nanoid@^3.1.28:
|
||||||
version "3.1.23"
|
version "3.1.29"
|
||||||
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.23.tgz#f744086ce7c2bc47ee0a8472574d5c78e4183a81"
|
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.29.tgz#214fb2d7a33e1a5bef4757b779dfaeb6a4e5aeb4"
|
||||||
integrity sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==
|
integrity sha512-dW2pUSGZ8ZnCFIlBIA31SV8huOGCHb6OwzVCc7A69rb/a+SgPBwfmLvK5TKQ3INPbRkcI8a/Owo0XbiTNH19wg==
|
||||||
|
|
||||||
native-url@0.3.4:
|
native-url@0.3.4:
|
||||||
version "0.3.4"
|
version "0.3.4"
|
||||||
|
@ -2050,14 +2074,14 @@ node-libs-browser@^2.2.1:
|
||||||
vm-browserify "^1.0.1"
|
vm-browserify "^1.0.1"
|
||||||
|
|
||||||
node-releases@^1.1.71:
|
node-releases@^1.1.71:
|
||||||
version "1.1.73"
|
version "1.1.76"
|
||||||
resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.73.tgz#dd4e81ddd5277ff846b80b52bb40c49edf7a7b20"
|
resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.76.tgz#df245b062b0cafbd5282ab6792f7dccc2d97f36e"
|
||||||
integrity sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg==
|
integrity sha512-9/IECtNr8dXNmPWmFXepT0/7o5eolGesHUa3mtr0KlgnCvnZxwh2qensKL42JJY2vQKC3nIBXetFAqR+PW1CmA==
|
||||||
|
|
||||||
node-releases@^1.1.75:
|
node-releases@^1.1.77:
|
||||||
version "1.1.75"
|
version "1.1.77"
|
||||||
resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.75.tgz#6dd8c876b9897a1b8e5a02de26afa79bb54ebbfe"
|
resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.77.tgz#50b0cfede855dd374e7585bf228ff34e57c1c32e"
|
||||||
integrity sha512-Qe5OUajvqrqDSy6wrWFmMwfJ0jVgwiw4T3KqmbTcZ62qW0gQkheXYhcFM1+lOVcGUoRxcEcfyvFMAnDgaF1VWw==
|
integrity sha512-rB1DUFUNAN4Gn9keO2K1efO35IDK7yKHCdCaIMvFO7yUYmmZYeDjnGKle26G4rwj+LKRQpjyUUvMkPglwGCYNQ==
|
||||||
|
|
||||||
normalize-path@^3.0.0, normalize-path@~3.0.0:
|
normalize-path@^3.0.0, normalize-path@~3.0.0:
|
||||||
version "3.0.0"
|
version "3.0.0"
|
||||||
|
@ -2069,6 +2093,11 @@ normalize-range@^0.1.2:
|
||||||
resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942"
|
resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942"
|
||||||
integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=
|
integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=
|
||||||
|
|
||||||
|
normalize.css@8.0.1:
|
||||||
|
version "8.0.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/normalize.css/-/normalize.css-8.0.1.tgz#9b98a208738b9cc2634caacbc42d131c97487bf3"
|
||||||
|
integrity sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg==
|
||||||
|
|
||||||
npm-run-path@^2.0.0:
|
npm-run-path@^2.0.0:
|
||||||
version "2.0.2"
|
version "2.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
|
resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
|
||||||
|
@ -2086,7 +2115,7 @@ object-hash@^2.2.0:
|
||||||
resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-2.2.0.tgz#5ad518581eefc443bd763472b8ff2e9c2c0d54a5"
|
resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-2.2.0.tgz#5ad518581eefc443bd763472b8ff2e9c2c0d54a5"
|
||||||
integrity sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==
|
integrity sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==
|
||||||
|
|
||||||
object-inspect@^1.10.3, object-inspect@^1.9.0:
|
object-inspect@^1.11.0, object-inspect@^1.9.0:
|
||||||
version "1.11.0"
|
version "1.11.0"
|
||||||
resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.0.tgz#9dceb146cedd4148a0d9e51ab88d34cf509922b1"
|
resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.0.tgz#9dceb146cedd4148a0d9e51ab88d34cf509922b1"
|
||||||
integrity sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==
|
integrity sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==
|
||||||
|
@ -2236,6 +2265,11 @@ pbkdf2@^3.0.3:
|
||||||
safe-buffer "^5.0.1"
|
safe-buffer "^5.0.1"
|
||||||
sha.js "^2.4.8"
|
sha.js "^2.4.8"
|
||||||
|
|
||||||
|
picocolors@^0.2.1:
|
||||||
|
version "0.2.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-0.2.1.tgz#570670f793646851d1ba135996962abad587859f"
|
||||||
|
integrity sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==
|
||||||
|
|
||||||
picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3:
|
picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3:
|
||||||
version "2.3.0"
|
version "2.3.0"
|
||||||
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972"
|
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972"
|
||||||
|
@ -2311,13 +2345,13 @@ postcss@8.2.15:
|
||||||
nanoid "^3.1.23"
|
nanoid "^3.1.23"
|
||||||
source-map "^0.6.1"
|
source-map "^0.6.1"
|
||||||
|
|
||||||
postcss@8.3.6, postcss@^8.1.6, postcss@^8.2.1:
|
postcss@8.3.9, postcss@^8.1.6, postcss@^8.2.1:
|
||||||
version "8.3.6"
|
version "8.3.9"
|
||||||
resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.3.6.tgz#2730dd76a97969f37f53b9a6096197be311cc4ea"
|
resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.3.9.tgz#98754caa06c4ee9eb59cc48bd073bb6bd3437c31"
|
||||||
integrity sha512-wG1cc/JhRgdqB6WHEuyLTedf3KIRuD0hG6ldkFEZNCjRxiC+3i6kkWUUbiJQayP28iwG35cEmAbe98585BYV0A==
|
integrity sha512-f/ZFyAKh9Dnqytx5X62jgjhhzttjZS7hMsohcI7HEI5tjELX/HxCy3EFhsRxyzGvrzFF+82XPvCS8T9TFleVJw==
|
||||||
dependencies:
|
dependencies:
|
||||||
colorette "^1.2.2"
|
nanoid "^3.1.28"
|
||||||
nanoid "^3.1.23"
|
picocolors "^0.2.1"
|
||||||
source-map-js "^0.6.2"
|
source-map-js "^0.6.2"
|
||||||
|
|
||||||
prettier@2.4.1:
|
prettier@2.4.1:
|
||||||
|
@ -2502,6 +2536,13 @@ react-refresh@0.8.3:
|
||||||
resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.8.3.tgz#721d4657672d400c5e3c75d063c4a85fb2d5d68f"
|
resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.8.3.tgz#721d4657672d400c5e3c75d063c4a85fb2d5d68f"
|
||||||
integrity sha512-X8jZHc7nCMjaCqoU+V2I0cOhNW+QMBwSUkeXnTi8IPe6zaRWfn60ZzvFDZqWPfmSJfjub7dDW1SP0jaHWLu/hg==
|
integrity sha512-X8jZHc7nCMjaCqoU+V2I0cOhNW+QMBwSUkeXnTi8IPe6zaRWfn60ZzvFDZqWPfmSJfjub7dDW1SP0jaHWLu/hg==
|
||||||
|
|
||||||
|
react-toastify@8.0.3:
|
||||||
|
version "8.0.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/react-toastify/-/react-toastify-8.0.3.tgz#7fbf65f69ec357aab8dd03c1496f9177aa92409a"
|
||||||
|
integrity sha512-rv3koC7f9lKKSkdpYgo/TGzgWlrB/aaiUInF1DyV7BpiM4kyTs+uhu6/r8XDMtBY2FOIHK+FlK3Iv7OzpA/tCA==
|
||||||
|
dependencies:
|
||||||
|
clsx "^1.1.1"
|
||||||
|
|
||||||
react@17.0.2:
|
react@17.0.2:
|
||||||
version "17.0.2"
|
version "17.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037"
|
resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037"
|
||||||
|
@ -2704,9 +2745,9 @@ side-channel@^1.0.4:
|
||||||
object-inspect "^1.9.0"
|
object-inspect "^1.9.0"
|
||||||
|
|
||||||
signal-exit@^3.0.0:
|
signal-exit@^3.0.0:
|
||||||
version "3.0.3"
|
version "3.0.4"
|
||||||
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c"
|
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.4.tgz#366a4684d175b9cab2081e3681fda3747b6c51d7"
|
||||||
integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==
|
integrity sha512-rqYhcAnZ6d/vTPGghdrw7iumdcbXpsk1b8IG/rz+VWV51DM0p7XCtMoJ3qhPLIbp3tvyt3pKRbaaEMZYpHto8Q==
|
||||||
|
|
||||||
simple-swizzle@^0.2.2:
|
simple-swizzle@^0.2.2:
|
||||||
version "0.2.2"
|
version "0.2.2"
|
||||||
|
@ -2864,10 +2905,10 @@ strip-eof@^1.0.0:
|
||||||
resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
|
resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
|
||||||
integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=
|
integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=
|
||||||
|
|
||||||
stripe@8.176.0:
|
stripe@8.181.0:
|
||||||
version "8.176.0"
|
version "8.181.0"
|
||||||
resolved "https://registry.yarnpkg.com/stripe/-/stripe-8.176.0.tgz#2f4980ab49acbfe6d67ecaddd54c05e20de9532c"
|
resolved "https://registry.yarnpkg.com/stripe/-/stripe-8.181.0.tgz#e49514b10c54d146cc5306204410658c2d689386"
|
||||||
integrity sha512-0KCDo8TWFgeNWU7cPaqdjO2u2OSth0cmWYZmA7xsuxRCk7/lgWbJ/UbeSphx74cCIjFCmGuzDoNuNxqon9lEbg==
|
integrity sha512-yEKT+/a/5OMYqGPhI/4jy/kiKHKeew1n9BvNtHbOA9lQDM8yVIYDx0nbQMj5rMowivAMqY67mejDJeSBlcPASA==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@types/node" ">=8.1.0"
|
"@types/node" ">=8.1.0"
|
||||||
qs "^6.6.0"
|
qs "^6.6.0"
|
||||||
|
@ -2941,10 +2982,10 @@ swr@1.0.1:
|
||||||
dependencies:
|
dependencies:
|
||||||
dequal "2.0.2"
|
dequal "2.0.2"
|
||||||
|
|
||||||
tailwindcss@2.2.15:
|
tailwindcss@2.2.16:
|
||||||
version "2.2.15"
|
version "2.2.16"
|
||||||
resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-2.2.15.tgz#8bee3ebe68b988c050508ce20633f35b040dd9fe"
|
resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-2.2.16.tgz#32f81bdf1758b639cb83b9d30bf7cbecdda49e5e"
|
||||||
integrity sha512-WgV41xTMbnSoTNMNnJvShQZ+8GmY86DmXTrCgnsveNZJdlybfwCItV8kAqjYmU49YiFr+ofzmT1JlAKajBZboQ==
|
integrity sha512-EireCtpQyyJ4Xz8NYzHafBoy4baCOO96flM0+HgtsFcIQ9KFy/YBK3GEtlnD+rXen0e4xm8t3WiUcKBJmN6yjg==
|
||||||
dependencies:
|
dependencies:
|
||||||
arg "^5.0.1"
|
arg "^5.0.1"
|
||||||
bytes "^3.0.0"
|
bytes "^3.0.0"
|
||||||
|
@ -3185,17 +3226,16 @@ which-boxed-primitive@^1.0.2:
|
||||||
is-symbol "^1.0.3"
|
is-symbol "^1.0.3"
|
||||||
|
|
||||||
which-typed-array@^1.1.2:
|
which-typed-array@^1.1.2:
|
||||||
version "1.1.4"
|
version "1.1.7"
|
||||||
resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.4.tgz#8fcb7d3ee5adf2d771066fba7cf37e32fe8711ff"
|
resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.7.tgz#2761799b9a22d4b8660b3c1b40abaa7739691793"
|
||||||
integrity sha512-49E0SpUe90cjpoc7BOJwyPHRqSAd12c10Qm2amdEZrJPCY2NDxaW01zHITrem+rnETY3dwrbH3UUrUwagfCYDA==
|
integrity sha512-vjxaB4nfDqwKI0ws7wZpxIlde1XrLX5uB0ZjpfshgmapJMD7jJWhZI+yToJTqaFByF0eNBcYxbjmCzoRP7CfEw==
|
||||||
dependencies:
|
dependencies:
|
||||||
available-typed-arrays "^1.0.2"
|
available-typed-arrays "^1.0.5"
|
||||||
call-bind "^1.0.0"
|
call-bind "^1.0.2"
|
||||||
es-abstract "^1.18.0-next.1"
|
es-abstract "^1.18.5"
|
||||||
foreach "^2.0.5"
|
foreach "^2.0.5"
|
||||||
function-bind "^1.1.1"
|
has-tostringtag "^1.0.0"
|
||||||
has-symbols "^1.0.1"
|
is-typed-array "^1.1.7"
|
||||||
is-typed-array "^1.1.3"
|
|
||||||
|
|
||||||
which@^1.2.9:
|
which@^1.2.9:
|
||||||
version "1.3.1"
|
version "1.3.1"
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
FROM node:16.9.1-alpine
|
FROM node:16.10.0-alpine
|
||||||
|
|
||||||
WORKDIR /usr/app
|
WORKDIR /usr/app
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
FROM node:16.9.1-alpine
|
FROM node:16.10.0-alpine
|
||||||
|
|
||||||
WORKDIR /usr/app
|
WORKDIR /usr/app
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
FROM node:16.9.1-alpine
|
FROM node:16.10.0-alpine
|
||||||
|
|
||||||
RUN apk update && apk add dnsmasq
|
RUN apk update && apk add dnsmasq
|
||||||
|
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
"lowdb": "^1.0.0",
|
"lowdb": "^1.0.0",
|
||||||
"skynet-js": "^3.0.2",
|
"skynet-js": "^3.0.2",
|
||||||
"write-file-atomic": "^3.0.3",
|
"write-file-atomic": "^3.0.3",
|
||||||
"yargs": "^17.1.1"
|
"yargs": "^17.2.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"prettier": "^2.4.1"
|
"prettier": "^2.4.1"
|
||||||
|
|
|
@ -64,9 +64,9 @@ accepts@~1.3.7:
|
||||||
negotiator "0.6.2"
|
negotiator "0.6.2"
|
||||||
|
|
||||||
ansi-regex@^5.0.0:
|
ansi-regex@^5.0.0:
|
||||||
version "5.0.0"
|
version "5.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75"
|
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
|
||||||
integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==
|
integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
|
||||||
|
|
||||||
ansi-styles@^4.0.0:
|
ansi-styles@^4.0.0:
|
||||||
version "4.3.0"
|
version "4.3.0"
|
||||||
|
@ -923,10 +923,10 @@ yargs-parser@^20.2.2:
|
||||||
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee"
|
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee"
|
||||||
integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==
|
integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==
|
||||||
|
|
||||||
yargs@^17.1.1:
|
yargs@^17.2.1:
|
||||||
version "17.1.1"
|
version "17.2.1"
|
||||||
resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.1.1.tgz#c2a8091564bdb196f7c0a67c1d12e5b85b8067ba"
|
resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.2.1.tgz#e2c95b9796a0e1f7f3bf4427863b42e0418191ea"
|
||||||
integrity sha512-c2k48R0PwKIqKhPMWjeiF6y2xY/gPMUlro0sgxqXpbOIohWiLNXWslsootttv7E1e73QPAMQSg5FeySbVcpsPQ==
|
integrity sha512-XfR8du6ua4K6uLGm5S6fA+FIJom/MdJcFNVY8geLlp2v8GYbOXD4EB1tPNZsRn4vBzKGMgb5DRZMeWuFc2GO8Q==
|
||||||
dependencies:
|
dependencies:
|
||||||
cliui "^7.0.2"
|
cliui "^7.0.2"
|
||||||
escalade "^3.1.1"
|
escalade "^3.1.1"
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
FROM node:16.9.1-alpine
|
FROM node:16.10.0-alpine
|
||||||
|
|
||||||
RUN apk update && apk add autoconf automake build-base libtool nasm pkgconfig
|
RUN apk update && apk add autoconf automake build-base libtool nasm pkgconfig
|
||||||
|
|
||||||
|
|
Binary file not shown.
After Width: | Height: | Size: 1.7 MiB |
|
@ -0,0 +1,27 @@
|
||||||
|
---
|
||||||
|
title: "Akash Network and Skynet Labs Integrate"
|
||||||
|
date: "2021-06-28"
|
||||||
|
description: "Providing the First Full-Stack Decentralized Web (dWeb) Solution to Handle Backup, Restore, and Migration"
|
||||||
|
author: "Skynet Labs"
|
||||||
|
categories: ["press release"]
|
||||||
|
avatar: "../images/skynet-avatar.png"
|
||||||
|
thumbnail: "../images/press-release.png"
|
||||||
|
---
|
||||||
|
|
||||||
|
**SAN FRANCISCO, California, June 28, 2021** — Akash Network, the open-source and decentralized cloud (DeCloud) also known as Airbnb for cloud computing, today announced a key integration with Skynet Labs, the team behind Sia, a decentralized storage network. By bringing together compute and storage layers, Akash Network and Skynet are now enabling developers to host their applications on a fully decentralized cloud.
|
||||||
|
|
||||||
|
![Akash Network + Skynet Labs](./akashnetwork-plus-skynetlabs.png)
|
||||||
|
|
||||||
|
Akash Network’s DeCloud is differentiated by its speed of deployment, flexibility, lower cost, and permissionless access. Now with Skynet as a key technology partner, Akash’s solution can integrate storage and compute resources. Akash will be able to leverage Skynet’s decentralized storage to backup and restore server instances, host larger volumes of data, and distribute files across multiple points of presence, ultimately improving the user experience. With this integration, Akash Network and Skynet can provide a full-stack solution that will handle backup, restore, and migration for databases running on the DeCloud.
|
||||||
|
|
||||||
|
“The full-stack solution for the decentralized web is now a reality, with Skynet as the front-end with storage, and Akash as the back-end API and database host,” said Greg Osuri, CEO of Akash Network. “Each step of this partnership has been supported and developed by the community, and began with a challenge on Twitter to combine Akash, Skynet, and Handshake into a single open-source package. We plan to support these efforts long-term through community-targeted funding.” The materialization of dWeb is a major shift away from computing resources being owned and operated by the three large centralized cloud software giants. Technology is now poised to shift away from Amazon Web Services (AWS), Google Cloud, and Microsoft Azure, to a decentralized network of cloud providers operating open-source software platforms and creating healthy market competition in an open marketplace with more providers and lower costs.
|
||||||
|
|
||||||
|
“The world of decentralized computing has seen major advancements in the past 10 years. The things we are able to accomplish today put decentralized infrastructure ahead of traditional architectures by achieving similar performance at lower cost and higher reliability,” said David Vorick, CEO of Skynet. “The real advantage, however, is the political stability - the terms of service and available APIs of centralized services change every day, but decentralization comes with guarantees. The entrepreneurs of tomorrow will build on decentralized tech, because it gives them so much more control over the future of their business.”
|
||||||
|
|
||||||
|
## About Akash Network
|
||||||
|
|
||||||
|
Akash Network, the world’s first decentralized and open-source cloud, accelerates deployment, scale, efficiency and price performance for high-growth industries like blockchain and machine learning/AI. Known as the "Airbnb for Cloud Compute”, Akash Network provides a fast, efficient and low-cost application deployment solution. Developers leveraging Akash Network can access cloud computing at up to three times less than the cost of centralized cloud providers like Amazon Web Services, Google Cloud and Microsoft Azure. Utilizing containerization and open-source technology, Akash Network leverages 85% of underutilized cloud capacity in 8.4 million global data centers, enabling anyone to buy and sell cloud computing. For more information visit: [https://akash.network/](https://akash.network/).
|
||||||
|
|
||||||
|
## About Skynet Labs
|
||||||
|
|
||||||
|
Skynet Labs builds uncompromising software infrastructure for the decentralized internet. This includes Sia, the leading decentralized cloud storage platform and Skynet, a content hosting and application development platform. Skynet Labs defines uncompromising infrastructure as scalable, trustless, secure, and most importantly, fully decentralized. Skynet Labs stands out as one of the few deeply technical teams that consistently deliver real products with significant potential. Learn more at [siasky.net](https://siasky.net/), join us on [Discord](https://discord.gg/skynetlabs), and email us at hello@sia.tech.
|
|
@ -0,0 +1,10 @@
|
||||||
|
---
|
||||||
|
title: "Announcing Homescreen: Decentralized Frontends for Web3"
|
||||||
|
date: "2021-09-17"
|
||||||
|
description: DeFi needs decentralized front-ends. Homescreen is the first and only dashboard for users to access all their DeFi apps in one place.
|
||||||
|
thumbnail: ./thumbnail.png
|
||||||
|
categories: ["blog"]
|
||||||
|
author: David Vorick
|
||||||
|
avatar: ../../team/david-vorick.png
|
||||||
|
external: https://blog.sia.tech/announcing-homescreen-decentralized-frontends-for-web3-113a3564530d
|
||||||
|
---
|
Binary file not shown.
After Width: | Height: | Size: 172 KiB |
|
@ -0,0 +1,10 @@
|
||||||
|
---
|
||||||
|
title: "ArGoApp and Skynet Labs: Making Decentralized Web App Deployment Easier than Ever"
|
||||||
|
date: "2021-08-25"
|
||||||
|
description: ArGoApp and Skynet are making web app hosting and deployment easier and better than on the centralized web
|
||||||
|
thumbnail: ./thumbnail.png
|
||||||
|
categories: ["blog"]
|
||||||
|
author: Nicole Tay
|
||||||
|
avatar: ../../team/nicole-tay.png
|
||||||
|
external: https://blog.sia.tech/argoapp-and-skynet-labs-making-decentralized-web-app-deployment-easier-than-ever-e577d411dea
|
||||||
|
---
|
Binary file not shown.
After Width: | Height: | Size: 681 KiB |
|
@ -0,0 +1,31 @@
|
||||||
|
---
|
||||||
|
title: "Decentralizing Websites with ENS and Skynet"
|
||||||
|
date: "2021-09-01"
|
||||||
|
description: "Decentralized web hosting on Skynet via .eth domains, including support from MetaMask and Cloudflare"
|
||||||
|
author: "Skynet Labs"
|
||||||
|
categories: ["press release"]
|
||||||
|
avatar: "../images/skynet-avatar.png"
|
||||||
|
thumbnail: "../images/press-release.png"
|
||||||
|
---
|
||||||
|
|
||||||
|
**BOSTON, Massachusetts, September 1, 2021** — Today, Ethereum Name Service (ENS) and Skynet Labs announce a partnership to advance Web3 via decentralized domain naming and decentralized web hosting, respectively. Built on Ethereum, ENS is a decentralized naming protocol and the most widely integrated blockchain naming service. Skynet Labs is the team behind the Sia blockchain network and is a leading decentralized data storage provider.
|
||||||
|
|
||||||
|
Skynet Labs now joins IPFS and Swarm in powering decentralized, censorship-resistant website hosting using an ENS name. “Happy we got Skynet integration done!” Brantly Millegan, Director of Operations at ENS, explained. “Decentralized websites are a key part of the emerging Web3 ecosystem, e.g. so that dapps can have decentralized front-ends.”
|
||||||
|
|
||||||
|
Owners of an ENS name can now use their .eth domain to point to web apps deployed to Skynet’s decentralized storage. This would not be possible without key support from MetaMask and Cloudflare, which resolve ENS names to data on Skynet.
|
||||||
|
|
||||||
|
Unlike traditional domain names, not all browsers can access ENS names. However, any user with the MetaMask extension installed on their browser is able to access the ENS domain and associated web app on Skynet.
|
||||||
|
|
||||||
|
Similarly, users on any browser or device can also access web apps stored on Skynet through Cloudflare’s eth.link service. Cloudflare accomplishes this by resolving .eth.link’s to their corresponding .eth address. MetaMask and Cloudflare provide key redundancy and censorship-resistance for decentralized websites, thus democratizing access to information in a free and open web.
|
||||||
|
|
||||||
|
David Vorick, Skynet Labs Founder and CEO shares his excitement for Skynet’s support of the Ethereum ecosystem: “We see the Web3 ecosystem as the new frontier for the Internet, and we are eager to push forward a world where people can control their own online experience.”
|
||||||
|
|
||||||
|
As leaders in the decentralized internet movement, ENS and Skynet Labs are proud to set the standard for more cross-chain integrations. The two teams showcase the importance of these collaborations in creating a better decentralized future around data ownership and self-determination.
|
||||||
|
|
||||||
|
## About ENS
|
||||||
|
|
||||||
|
The Ethereum Name Service (ENS) is the leading blockchain-based naming protocol, with +100k users and +260 services where you can use your ENS name. In addition to pointing at a decentralized website, you can also use your ENS name as your portable web3 username and to simplify cryptocurrency payments. Learn more at [ens.domains](https://ens.domains/).
|
||||||
|
|
||||||
|
## About Skynet Labs
|
||||||
|
|
||||||
|
Skynet Labs builds resilient software infrastructure for the decentralized internet. This includes Sia, the leading decentralized cloud storage platform and Skynet, a content hosting and application development platform. Skynet Labs defines uncompromising infrastructure as scalable, trustless, secure, and most importantly, fully decentralized. Skynet Labs stands out as one of the few deeply technical teams that consistently deliver real products with significant potential. Learn more at [siasky.net](https://siasky.net/), join us on [Discord](https://discord.gg/skynetlabs), and email us at hello@sia.tech.
|
|
@ -0,0 +1,10 @@
|
||||||
|
---
|
||||||
|
title: "Skynet Summer 2021 Update"
|
||||||
|
date: "2021-07-12"
|
||||||
|
description: Check out what changes to Skynet are coming immediately, near-term, and on the horizon.
|
||||||
|
thumbnail: ./thumbnail.png
|
||||||
|
categories: ["blog"]
|
||||||
|
author: David Vorick
|
||||||
|
avatar: ../../team/david-vorick.png
|
||||||
|
external: https://blog.sia.tech/skynet-summer-2021-update-86ed8db21eae
|
||||||
|
---
|
Binary file not shown.
After Width: | Height: | Size: 407 KiB |
|
@ -9,16 +9,16 @@
|
||||||
"@fontsource/source-sans-pro": "^4.5.0",
|
"@fontsource/source-sans-pro": "^4.5.0",
|
||||||
"@svgr/webpack": "^5.5.0",
|
"@svgr/webpack": "^5.5.0",
|
||||||
"@tailwindcss/typography": "^0.4.1",
|
"@tailwindcss/typography": "^0.4.1",
|
||||||
"autoprefixer": "^10.3.4",
|
"autoprefixer": "^10.3.7",
|
||||||
"bytes": "^3.1.0",
|
"bytes": "^3.1.0",
|
||||||
"classnames": "^2.3.1",
|
"classnames": "^2.3.1",
|
||||||
"copy-text-to-clipboard": "^3.0.1",
|
"copy-text-to-clipboard": "^3.0.1",
|
||||||
"crypto-browserify": "^3.12.0",
|
"crypto-browserify": "^3.12.0",
|
||||||
"framer-motion": "^4.1.17",
|
"framer-motion": "^4.1.17",
|
||||||
"gatsby": "^3.14.0",
|
"gatsby": "^3.14.2",
|
||||||
"gatsby-background-image": "^1.5.3",
|
"gatsby-background-image": "^1.5.3",
|
||||||
"gatsby-image": "^3.11.0",
|
"gatsby-image": "^3.11.0",
|
||||||
"gatsby-plugin-image": "^1.14.0",
|
"gatsby-plugin-image": "^1.14.1",
|
||||||
"gatsby-plugin-manifest": "^3.14.0",
|
"gatsby-plugin-manifest": "^3.14.0",
|
||||||
"gatsby-plugin-matomo": "^0.10.0",
|
"gatsby-plugin-matomo": "^0.10.0",
|
||||||
"gatsby-plugin-offline": "^4.14.0",
|
"gatsby-plugin-offline": "^4.14.0",
|
||||||
|
@ -26,9 +26,9 @@
|
||||||
"gatsby-plugin-purgecss": "^6.0.2",
|
"gatsby-plugin-purgecss": "^6.0.2",
|
||||||
"gatsby-plugin-react-helmet": "^4.14.0",
|
"gatsby-plugin-react-helmet": "^4.14.0",
|
||||||
"gatsby-plugin-robots-txt": "^1.6.10",
|
"gatsby-plugin-robots-txt": "^1.6.10",
|
||||||
"gatsby-plugin-sharp": "^3.14.0",
|
"gatsby-plugin-sharp": "^3.14.1",
|
||||||
"gatsby-plugin-svgr": "^3.0.0-beta.0",
|
"gatsby-plugin-svgr": "^3.0.0-beta.0",
|
||||||
"gatsby-remark-classes": "^1.0.0",
|
"gatsby-remark-classes": "^1.0.2",
|
||||||
"gatsby-remark-copy-linked-files": "^4.11.0",
|
"gatsby-remark-copy-linked-files": "^4.11.0",
|
||||||
"gatsby-remark-images": "^5.11.0",
|
"gatsby-remark-images": "^5.11.0",
|
||||||
"gatsby-remark-prismjs": "^5.11.0",
|
"gatsby-remark-prismjs": "^5.11.0",
|
||||||
|
@ -43,17 +43,17 @@
|
||||||
"http-status-codes": "^2.1.4",
|
"http-status-codes": "^2.1.4",
|
||||||
"jsonp": "^0.2.1",
|
"jsonp": "^0.2.1",
|
||||||
"ms": "^2.1.2",
|
"ms": "^2.1.2",
|
||||||
"nanoid": "^3.1.25",
|
"nanoid": "^3.1.29",
|
||||||
"normalize.css": "^8.0.1",
|
"normalize.css": "^8.0.1",
|
||||||
"path-browserify": "^1.0.1",
|
"path-browserify": "^1.0.1",
|
||||||
"polished": "^4.1.3",
|
"polished": "^4.1.3",
|
||||||
"popmotion": "^9.4.0",
|
"popmotion": "^10.0.1",
|
||||||
"postcss": "^8.3.6",
|
"postcss": "^8.3.9",
|
||||||
"preact-svg-loader": "^0.2.1",
|
"preact-svg-loader": "^0.2.1",
|
||||||
"prop-types": "^15.7.2",
|
"prop-types": "^15.7.2",
|
||||||
"react": "^17.0.2",
|
"react": "^17.0.2",
|
||||||
"react-dom": "^17.0.2",
|
"react-dom": "^17.0.2",
|
||||||
"react-dropzone": "^11.4.0",
|
"react-dropzone": "^11.4.2",
|
||||||
"react-helmet": "^6.1.0",
|
"react-helmet": "^6.1.0",
|
||||||
"react-share": "^4.4.0",
|
"react-share": "^4.4.0",
|
||||||
"react-svg-loader": "^3.0.3",
|
"react-svg-loader": "^3.0.3",
|
||||||
|
@ -62,11 +62,11 @@
|
||||||
"skynet-js": "^4.0.11-beta",
|
"skynet-js": "^4.0.11-beta",
|
||||||
"stream-browserify": "^3.0.0",
|
"stream-browserify": "^3.0.0",
|
||||||
"swr": "^1.0.1",
|
"swr": "^1.0.1",
|
||||||
"tailwindcss": "^2.2.15"
|
"tailwindcss": "^2.2.16"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"cross-env": "^7.0.3",
|
"cross-env": "^7.0.3",
|
||||||
"cypress": "^8.4.1",
|
"cypress": "^8.6.0",
|
||||||
"cypress-file-upload": "^5.0.8",
|
"cypress-file-upload": "^5.0.8",
|
||||||
"prettier": "^2.4.1"
|
"prettier": "^2.4.1"
|
||||||
},
|
},
|
||||||
|
|
|
@ -12,6 +12,7 @@ const NewsHeader = () => {
|
||||||
id
|
id
|
||||||
frontmatter {
|
frontmatter {
|
||||||
title
|
title
|
||||||
|
external
|
||||||
}
|
}
|
||||||
fields {
|
fields {
|
||||||
slug
|
slug
|
||||||
|
@ -26,23 +27,20 @@ const NewsHeader = () => {
|
||||||
|
|
||||||
if (!latestNews) return null; // no news
|
if (!latestNews) return null; // no news
|
||||||
|
|
||||||
// hardcoded news for now
|
const { frontmatter, fields } = latestNews.node;
|
||||||
const CURRENT_NEWS_URL =
|
const { title, external } = frontmatter;
|
||||||
"https://blog.sia.tech/mysky-your-home-on-the-global-operating-system-of-the-future-5a288f89825c";
|
const link = external ? { href: external } : { to: fields.slug };
|
||||||
const CURRENT_NEWS_TXT = "MySky: Your Home on the Global Operating System of the Future";
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="bg-palette-500 px-8 p-3">
|
<div className="bg-palette-500 px-8 p-3">
|
||||||
<div className="max-w-layout mx-auto">
|
<div className="max-w-layout mx-auto">
|
||||||
<div className="flex justify-between">
|
<div className="flex justify-between">
|
||||||
<Link
|
<Link
|
||||||
// to={latestNews.node.fields.slug}
|
{...link}
|
||||||
href={CURRENT_NEWS_URL}
|
|
||||||
className="text-palette-300 font-content leading-8 flex items-center overflow-hidden text-base hover:text-primary transition-colors duration-200"
|
className="text-palette-300 font-content leading-8 flex items-center overflow-hidden text-base hover:text-primary transition-colors duration-200"
|
||||||
>
|
>
|
||||||
<ArrowRight className="mr-2 flex-shrink-0 fill-current text-primary" />
|
<ArrowRight className="mr-2 flex-shrink-0 fill-current text-primary" />
|
||||||
{/* <span className="truncate">{latestNews.node.frontmatter.title}</span> */}
|
<span className="truncate">{title}</span>
|
||||||
<span className="truncate">{CURRENT_NEWS_TXT}</span>
|
|
||||||
</Link>
|
</Link>
|
||||||
|
|
||||||
<div className="ml-auto items-center pl-8 hidden desktop:block">
|
<div className="ml-auto items-center pl-8 hidden desktop:block">
|
||||||
|
|
|
@ -6,39 +6,36 @@ import { NewsSummary } from "../components/News";
|
||||||
import Link from "../components/Link";
|
import Link from "../components/Link";
|
||||||
import Seo from "../components/seo";
|
import Seo from "../components/seo";
|
||||||
|
|
||||||
const NewsCard = ({ ...props }) => {
|
const NewsCard = ({ frontmatter, fields }) => {
|
||||||
const linkProps = { to: !props.frontmatter.external && props.fields.slug, href: props.frontmatter.external };
|
const { title, external, categories, description, thumbnail, avatar, author, date } = frontmatter;
|
||||||
|
const link = external ? { href: external } : { to: fields.slug };
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="flex flex-col">
|
<div className="flex flex-col">
|
||||||
<Link {...linkProps} className="flex items-center">
|
<Link {...link} className="flex items-center">
|
||||||
<GatsbyImage image={getImage(props.frontmatter.thumbnail)} alt={props.frontmatter.title} />
|
<GatsbyImage image={getImage(thumbnail)} alt={title} />
|
||||||
</Link>
|
</Link>
|
||||||
|
|
||||||
{props.frontmatter.categories && (
|
{categories && (
|
||||||
<div className="mt-6">
|
<div className="mt-6">
|
||||||
{props.frontmatter.categories.map((category) => (
|
{categories.map((category) => (
|
||||||
<Label key={category}>{category}</Label>
|
<Label key={category}>{category}</Label>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
<Link {...linkProps} className="text-xl mt-6">
|
<Link {...link} className="text-xl mt-6">
|
||||||
{props.frontmatter.title}
|
{title}
|
||||||
</Link>
|
</Link>
|
||||||
|
|
||||||
{props.frontmatter.description && (
|
{description && (
|
||||||
<Link {...linkProps} className="font-content text-palette-400 mt-4">
|
<Link {...link} className="font-content text-palette-400 mt-4">
|
||||||
{props.frontmatter.description}
|
{description}
|
||||||
</Link>
|
</Link>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
<div className="mt-6">
|
<div className="mt-6">
|
||||||
<NewsSummary
|
<NewsSummary avatar={avatar} author={author} date={date} />
|
||||||
avatar={props.frontmatter.avatar}
|
|
||||||
author={props.frontmatter.author}
|
|
||||||
date={props.frontmatter.date}
|
|
||||||
/>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -6,45 +6,72 @@ import os
|
||||||
import ssl
|
import ssl
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
TIMEOUT=120
|
TIMEOUT = 120
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
if len(sys.argv) != 3:
|
if len(sys.argv) != 3:
|
||||||
print('USAGE: [INDEX_PREFIX=(default "")] [ARCHIVE=(default false)] ... {} NUM_OF_DAYS http://HOSTNAME[:PORT]'.format(sys.argv[0]))
|
print(
|
||||||
print('NUM_OF_DAYS ... delete indices that are older than the given number of days.')
|
'USAGE: [INDEX_PREFIX=(default "")] [ARCHIVE=(default false)] ... {} NUM_OF_DAYS http://HOSTNAME[:PORT]'.format(
|
||||||
print('HOSTNAME ... specifies which Elasticsearch hosts URL to search and delete indices from.')
|
sys.argv[0]
|
||||||
print('TIMEOUT ... number of seconds to wait for master node response.'.format(TIMEOUT))
|
)
|
||||||
print('INDEX_PREFIX ... specifies index prefix.')
|
)
|
||||||
print('INDEX_DATE_SEPARATOR ... specifies index date separator.')
|
print(
|
||||||
print('ARCHIVE ... specifies whether to remove archive indices (only works for rollover) (default false).')
|
"NUM_OF_DAYS ... delete indices that are older than the given number of days."
|
||||||
print('ROLLOVER ... specifies whether to remove indices created by rollover (default false).')
|
)
|
||||||
print('ES_USERNAME ... The username required by Elasticsearch.')
|
print(
|
||||||
print('ES_PASSWORD ... The password required by Elasticsearch.')
|
"HOSTNAME ... specifies which Elasticsearch hosts URL to search and delete indices from."
|
||||||
print('ES_TLS ... enable TLS (default false).')
|
)
|
||||||
print('ES_TLS_CA ... Path to TLS CA file.')
|
print(
|
||||||
print('ES_TLS_CERT ... Path to TLS certificate file.')
|
"TIMEOUT ... number of seconds to wait for master node response, default: {}".format(
|
||||||
print('ES_TLS_KEY ... Path to TLS key file.')
|
TIMEOUT
|
||||||
print('ES_TLS_SKIP_HOST_VERIFY ... (insecure) Skip server\'s certificate chain and host name verification.')
|
)
|
||||||
|
)
|
||||||
|
print("INDEX_PREFIX ... specifies index prefix.")
|
||||||
|
print("INDEX_DATE_SEPARATOR ... specifies index date separator.")
|
||||||
|
print(
|
||||||
|
"ARCHIVE ... specifies whether to remove archive indices (only works for rollover) (default false)."
|
||||||
|
)
|
||||||
|
print(
|
||||||
|
"ROLLOVER ... specifies whether to remove indices created by rollover (default false)."
|
||||||
|
)
|
||||||
|
print("ES_USERNAME ... The username required by Elasticsearch.")
|
||||||
|
print("ES_PASSWORD ... The password required by Elasticsearch.")
|
||||||
|
print("ES_TLS ... enable TLS (default false).")
|
||||||
|
print("ES_TLS_CA ... Path to TLS CA file.")
|
||||||
|
print("ES_TLS_CERT ... Path to TLS certificate file.")
|
||||||
|
print("ES_TLS_KEY ... Path to TLS key file.")
|
||||||
|
print(
|
||||||
|
"ES_TLS_SKIP_HOST_VERIFY ... (insecure) Skip server's certificate chain and host name verification."
|
||||||
|
)
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
client = create_client(os.getenv("ES_USERNAME"), os.getenv("ES_PASSWORD"), str2bool(os.getenv("ES_TLS", 'false')), os.getenv("ES_TLS_CA"), os.getenv("ES_TLS_CERT"), os.getenv("ES_TLS_KEY"), str2bool(os.getenv("ES_TLS_SKIP_HOST_VERIFY", 'false')))
|
client = create_client(
|
||||||
|
os.getenv("ES_USERNAME"),
|
||||||
|
os.getenv("ES_PASSWORD"),
|
||||||
|
str2bool(os.getenv("ES_TLS", "false")),
|
||||||
|
os.getenv("ES_TLS_CA"),
|
||||||
|
os.getenv("ES_TLS_CERT"),
|
||||||
|
os.getenv("ES_TLS_KEY"),
|
||||||
|
str2bool(os.getenv("ES_TLS_SKIP_HOST_VERIFY", "false")),
|
||||||
|
)
|
||||||
ilo = curator.IndexList(client)
|
ilo = curator.IndexList(client)
|
||||||
empty_list(ilo, 'Elasticsearch has no indices')
|
empty_list(ilo, "Elasticsearch has no indices")
|
||||||
|
|
||||||
prefix = os.getenv("INDEX_PREFIX", '')
|
prefix = os.getenv("INDEX_PREFIX", "")
|
||||||
if prefix != '':
|
if prefix != "":
|
||||||
prefix += '-'
|
prefix += "-"
|
||||||
separator = os.getenv("INDEX_DATE_SEPARATOR", '-')
|
separator = os.getenv("INDEX_DATE_SEPARATOR", "-")
|
||||||
|
|
||||||
if str2bool(os.getenv("ARCHIVE", 'false')):
|
if str2bool(os.getenv("ARCHIVE", "false")):
|
||||||
filter_archive_indices_rollover(ilo, prefix)
|
filter_archive_indices_rollover(ilo, prefix)
|
||||||
else:
|
else:
|
||||||
if str2bool(os.getenv("ROLLOVER", 'false')):
|
if str2bool(os.getenv("ROLLOVER", "false")):
|
||||||
filter_main_indices_rollover(ilo, prefix)
|
filter_main_indices_rollover(ilo, prefix)
|
||||||
else:
|
else:
|
||||||
filter_main_indices(ilo, prefix, separator)
|
filter_main_indices(ilo, prefix, separator)
|
||||||
|
|
||||||
empty_list(ilo, 'No indices to delete')
|
empty_list(ilo, "No indices to delete")
|
||||||
|
|
||||||
for index in ilo.working_list():
|
for index in ilo.working_list():
|
||||||
print("Removing", index)
|
print("Removing", index)
|
||||||
|
@ -57,32 +84,50 @@ def filter_main_indices(ilo, prefix, separator):
|
||||||
date_regex = "\d{4}" + separator + "\d{2}" + separator + "\d{2}"
|
date_regex = "\d{4}" + separator + "\d{2}" + separator + "\d{2}"
|
||||||
time_string = "%Y" + separator + "%m" + separator + "%d"
|
time_string = "%Y" + separator + "%m" + separator + "%d"
|
||||||
|
|
||||||
ilo.filter_by_regex(kind='regex', value=prefix + "jaeger-(span|service|dependencies)-" + date_regex)
|
ilo.filter_by_regex(
|
||||||
|
kind="regex", value=prefix + "jaeger-(span|service|dependencies)-" + date_regex
|
||||||
|
)
|
||||||
empty_list(ilo, "No indices to delete")
|
empty_list(ilo, "No indices to delete")
|
||||||
# This excludes archive index as we use source='name'
|
# This excludes archive index as we use source='name'
|
||||||
# source `creation_date` would include archive index
|
# source `creation_date` would include archive index
|
||||||
ilo.filter_by_age(source='name', direction='older', timestring=time_string, unit='days', unit_count=int(sys.argv[1]))
|
ilo.filter_by_age(
|
||||||
|
source="name",
|
||||||
|
direction="older",
|
||||||
|
timestring=time_string,
|
||||||
|
unit="days",
|
||||||
|
unit_count=int(sys.argv[1]),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def filter_main_indices_rollover(ilo, prefix):
|
def filter_main_indices_rollover(ilo, prefix):
|
||||||
ilo.filter_by_regex(kind='regex', value=prefix + "jaeger-(span|service)-\d{6}")
|
ilo.filter_by_regex(kind="regex", value=prefix + "jaeger-(span|service)-\d{6}")
|
||||||
empty_list(ilo, "No indices to delete")
|
empty_list(ilo, "No indices to delete")
|
||||||
# do not remove active write indices
|
# do not remove active write indices
|
||||||
ilo.filter_by_alias(aliases=[prefix + 'jaeger-span-write'], exclude=True)
|
ilo.filter_by_alias(aliases=[prefix + "jaeger-span-write"], exclude=True)
|
||||||
empty_list(ilo, "No indices to delete")
|
empty_list(ilo, "No indices to delete")
|
||||||
ilo.filter_by_alias(aliases=[prefix + 'jaeger-service-write'], exclude=True)
|
ilo.filter_by_alias(aliases=[prefix + "jaeger-service-write"], exclude=True)
|
||||||
empty_list(ilo, "No indices to delete")
|
empty_list(ilo, "No indices to delete")
|
||||||
ilo.filter_by_age(source='creation_date', direction='older', unit='days', unit_count=int(sys.argv[1]))
|
ilo.filter_by_age(
|
||||||
|
source="creation_date",
|
||||||
|
direction="older",
|
||||||
|
unit="days",
|
||||||
|
unit_count=int(sys.argv[1]),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def filter_archive_indices_rollover(ilo, prefix):
|
def filter_archive_indices_rollover(ilo, prefix):
|
||||||
# Remove only rollover archive indices
|
# Remove only rollover archive indices
|
||||||
# Do not remove active write archive index
|
# Do not remove active write archive index
|
||||||
ilo.filter_by_regex(kind='regex', value=prefix + "jaeger-span-archive-\d{6}")
|
ilo.filter_by_regex(kind="regex", value=prefix + "jaeger-span-archive-\d{6}")
|
||||||
empty_list(ilo, "No indices to delete")
|
empty_list(ilo, "No indices to delete")
|
||||||
ilo.filter_by_alias(aliases=[prefix + 'jaeger-span-archive-write'], exclude=True)
|
ilo.filter_by_alias(aliases=[prefix + "jaeger-span-archive-write"], exclude=True)
|
||||||
empty_list(ilo, "No indices to delete")
|
empty_list(ilo, "No indices to delete")
|
||||||
ilo.filter_by_age(source='creation_date', direction='older', unit='days', unit_count=int(sys.argv[1]))
|
ilo.filter_by_age(
|
||||||
|
source="creation_date",
|
||||||
|
direction="older",
|
||||||
|
unit="days",
|
||||||
|
unit_count=int(sys.argv[1]),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def empty_list(ilo, error_msg):
|
def empty_list(ilo, error_msg):
|
||||||
|
@ -94,7 +139,7 @@ def empty_list(ilo, error_msg):
|
||||||
|
|
||||||
|
|
||||||
def str2bool(v):
|
def str2bool(v):
|
||||||
return v.lower() in ('true', '1')
|
return v.lower() in ("true", "1")
|
||||||
|
|
||||||
|
|
||||||
def create_client(username, password, tls, ca, cert, key, skipHostVerify):
|
def create_client(username, password, tls, ca, cert, key, skipHostVerify):
|
||||||
|
@ -105,7 +150,9 @@ def create_client(username, password, tls, ca, cert, key, skipHostVerify):
|
||||||
context.check_hostname = False
|
context.check_hostname = False
|
||||||
context.verify_mode = ssl.CERT_NONE
|
context.verify_mode = ssl.CERT_NONE
|
||||||
if username is not None and password is not None:
|
if username is not None and password is not None:
|
||||||
return elasticsearch.Elasticsearch(sys.argv[2:], http_auth=(username, password), ssl_context=context)
|
return elasticsearch.Elasticsearch(
|
||||||
|
sys.argv[2:], http_auth=(username, password), ssl_context=context
|
||||||
|
)
|
||||||
elif tls:
|
elif tls:
|
||||||
context.load_cert_chain(certfile=cert, keyfile=key)
|
context.load_cert_chain(certfile=cert, keyfile=key)
|
||||||
return elasticsearch.Elasticsearch(sys.argv[2:], ssl_context=context)
|
return elasticsearch.Elasticsearch(sys.argv[2:], ssl_context=context)
|
||||||
|
|
|
@ -1,10 +1,16 @@
|
||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
import traceback, os, re, asyncio, requests, json
|
|
||||||
from bot_utils import setup, send_msg
|
from bot_utils import setup, send_msg
|
||||||
from random import randint
|
from random import randint
|
||||||
from time import sleep
|
from time import sleep
|
||||||
|
|
||||||
|
import traceback
|
||||||
|
import os
|
||||||
|
import re
|
||||||
|
import asyncio
|
||||||
|
import requests
|
||||||
|
import json
|
||||||
|
|
||||||
setup()
|
setup()
|
||||||
|
|
||||||
AIRTABLE_API_KEY = os.getenv("AIRTABLE_API_KEY")
|
AIRTABLE_API_KEY = os.getenv("AIRTABLE_API_KEY")
|
||||||
|
@ -12,6 +18,7 @@ AIRTABLE_BASE = os.getenv("AIRTABLE_BASE", "app89plJvA9EqTJEc")
|
||||||
AIRTABLE_TABLE = os.getenv("AIRTABLE_TABLE", "Table%201")
|
AIRTABLE_TABLE = os.getenv("AIRTABLE_TABLE", "Table%201")
|
||||||
AIRTABLE_FIELD = os.getenv("AIRTABLE_FIELD", "Link")
|
AIRTABLE_FIELD = os.getenv("AIRTABLE_FIELD", "Link")
|
||||||
|
|
||||||
|
|
||||||
async def run_checks():
|
async def run_checks():
|
||||||
try:
|
try:
|
||||||
await block_skylinks_from_airtable()
|
await block_skylinks_from_airtable()
|
||||||
|
@ -31,10 +38,22 @@ async def block_skylinks_from_airtable():
|
||||||
offset = None
|
offset = None
|
||||||
retry = 0
|
retry = 0
|
||||||
while len(skylinks) == 0 or offset:
|
while len(skylinks) == 0 or offset:
|
||||||
print("Requesting a batch of records from Airtable with " + (offset if offset else "empty") + " offset" + (" (retry " + str(retry) + ")" if retry else ""))
|
print(
|
||||||
query = "&".join(["fields%5B%5D=" + AIRTABLE_FIELD, ("offset=" + offset) if offset else ""])
|
"Requesting a batch of records from Airtable with "
|
||||||
|
+ (offset if offset else "empty")
|
||||||
|
+ " offset"
|
||||||
|
+ (" (retry " + str(retry) + ")" if retry else "")
|
||||||
|
)
|
||||||
|
query = "&".join(
|
||||||
|
["fields%5B%5D=" + AIRTABLE_FIELD, ("offset=" + offset) if offset else ""]
|
||||||
|
)
|
||||||
response = requests.get(
|
response = requests.get(
|
||||||
"https://api.airtable.com/v0/" + AIRTABLE_BASE + "/" + AIRTABLE_TABLE + "?" + query,
|
"https://api.airtable.com/v0/"
|
||||||
|
+ AIRTABLE_BASE
|
||||||
|
+ "/"
|
||||||
|
+ AIRTABLE_TABLE
|
||||||
|
+ "?"
|
||||||
|
+ query,
|
||||||
headers=headers,
|
headers=headers,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -44,40 +63,62 @@ async def block_skylinks_from_airtable():
|
||||||
if response.status_code == 429:
|
if response.status_code == 429:
|
||||||
if retry < 100:
|
if retry < 100:
|
||||||
retry = retry + 1
|
retry = retry + 1
|
||||||
sleep(randint(1,10))
|
sleep(randint(1, 10))
|
||||||
continue
|
continue
|
||||||
else:
|
else:
|
||||||
return await send_msg("Airtable: too many retries, aborting!", force_notify=True)
|
return await send_msg(
|
||||||
|
"Airtable: too many retries, aborting!", force_notify=True
|
||||||
|
)
|
||||||
retry = 0 # reset retry counter
|
retry = 0 # reset retry counter
|
||||||
|
|
||||||
if response.status_code != 200:
|
if response.status_code != 200:
|
||||||
status_code = str(response.status_code)
|
status_code = str(response.status_code)
|
||||||
response_text = response.text or "empty response"
|
response_text = response.text or "empty response"
|
||||||
message = "Airtable blocklist integration responded with code " + status_code + ": " + response_text
|
message = (
|
||||||
|
"Airtable blocklist integration responded with code "
|
||||||
|
+ status_code
|
||||||
|
+ ": "
|
||||||
|
+ response_text
|
||||||
|
)
|
||||||
return await send_msg(message, force_notify=False)
|
return await send_msg(message, force_notify=False)
|
||||||
|
|
||||||
data = response.json()
|
data = response.json()
|
||||||
|
|
||||||
if len(data["records"]) == 0:
|
if len(data["records"]) == 0:
|
||||||
return print("Airtable returned 0 records - make sure your configuration is correct")
|
return print(
|
||||||
|
"Airtable returned 0 records - make sure your configuration is correct"
|
||||||
|
)
|
||||||
|
|
||||||
skylinks = skylinks + [entry["fields"].get(AIRTABLE_FIELD, "") for entry in data["records"]]
|
skylinks = skylinks + [
|
||||||
skylinks = [skylink for skylink in skylinks if skylink] # filter empty skylinks, most likely empty rows
|
entry["fields"].get(AIRTABLE_FIELD, "") for entry in data["records"]
|
||||||
|
]
|
||||||
|
skylinks = [
|
||||||
|
skylink for skylink in skylinks if skylink
|
||||||
|
] # filter empty skylinks, most likely empty rows
|
||||||
|
|
||||||
offset = data.get("offset")
|
offset = data.get("offset")
|
||||||
|
|
||||||
print("Airtable returned total " + str(len(skylinks)) + " skylinks to block")
|
print("Airtable returned total " + str(len(skylinks)) + " skylinks to block")
|
||||||
|
|
||||||
skylinks_returned = skylinks
|
skylinks_returned = skylinks
|
||||||
skylinks = [skylink for skylink in skylinks if re.search("^[a-zA-Z0-9_-]{46}$", skylink)]
|
skylinks = [
|
||||||
|
skylink for skylink in skylinks if re.search("^[a-zA-Z0-9_-]{46}$", skylink)
|
||||||
|
]
|
||||||
|
|
||||||
if len(skylinks_returned) != len(skylinks):
|
if len(skylinks_returned) != len(skylinks):
|
||||||
invalid_skylinks = [str(skylink) for skylink in list(set(skylinks_returned) - set(skylinks))]
|
invalid_skylinks = [
|
||||||
message = str(len(invalid_skylinks)) + " of the skylinks returned from Airtable are not valid"
|
str(skylink) for skylink in list(set(skylinks_returned) - set(skylinks))
|
||||||
|
]
|
||||||
|
message = (
|
||||||
|
str(len(invalid_skylinks))
|
||||||
|
+ " of the skylinks returned from Airtable are not valid"
|
||||||
|
)
|
||||||
await send_msg(message, file=("\n".join(invalid_skylinks)))
|
await send_msg(message, file=("\n".join(invalid_skylinks)))
|
||||||
|
|
||||||
apipassword = exec("docker exec sia cat /sia-data/apipassword")
|
apipassword = exec("docker exec sia cat /sia-data/apipassword")
|
||||||
ipaddress = exec("docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' sia")
|
ipaddress = exec(
|
||||||
|
"docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' sia"
|
||||||
|
)
|
||||||
|
|
||||||
print("Sending blocklist request to siad")
|
print("Sending blocklist request to siad")
|
||||||
response = requests.post(
|
response = requests.post(
|
||||||
|
@ -92,7 +133,12 @@ async def block_skylinks_from_airtable():
|
||||||
else:
|
else:
|
||||||
status_code = str(response.status_code)
|
status_code = str(response.status_code)
|
||||||
response_text = response.text or "empty response"
|
response_text = response.text or "empty response"
|
||||||
message = "Siad blocklist endpoint responded with code " + status_code + ": " + response_text
|
message = (
|
||||||
|
"Siad blocklist endpoint responded with code "
|
||||||
|
+ status_code
|
||||||
|
+ ": "
|
||||||
|
+ response_text
|
||||||
|
)
|
||||||
return await send_msg(message, force_notify=False)
|
return await send_msg(message, force_notify=False)
|
||||||
|
|
||||||
print("Searching nginx cache for blocked files")
|
print("Searching nginx cache for blocked files")
|
||||||
|
@ -101,15 +147,23 @@ async def block_skylinks_from_airtable():
|
||||||
for i in range(0, len(skylinks), batch_size):
|
for i in range(0, len(skylinks), batch_size):
|
||||||
cached_files_command = (
|
cached_files_command = (
|
||||||
"find /data/nginx/cache/ -type f | xargs -r grep -Els '^Skynet-Skylink: ("
|
"find /data/nginx/cache/ -type f | xargs -r grep -Els '^Skynet-Skylink: ("
|
||||||
+ "|".join(skylinks[i:i+batch_size])
|
+ "|".join(skylinks[i : i + batch_size])
|
||||||
+ ")'"
|
+ ")'"
|
||||||
)
|
)
|
||||||
cached_files_count+= int(exec('docker exec nginx bash -c "' + cached_files_command + ' | xargs -r rm -v | wc -l"'))
|
cached_files_count += int(
|
||||||
|
exec(
|
||||||
|
'docker exec nginx bash -c "'
|
||||||
|
+ cached_files_command
|
||||||
|
+ ' | xargs -r rm -v | wc -l"'
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
if cached_files_count == 0:
|
if cached_files_count == 0:
|
||||||
return print("No nginx cached files matching blocked skylinks were found")
|
return print("No nginx cached files matching blocked skylinks were found")
|
||||||
|
|
||||||
message = "Purged " + str(cached_files_count) + " blocklisted files from nginx cache"
|
message = (
|
||||||
|
"Purged " + str(cached_files_count) + " blocklisted files from nginx cache"
|
||||||
|
)
|
||||||
return await send_msg(message)
|
return await send_msg(message)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,12 +1,19 @@
|
||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
from urllib.request import urlopen, Request
|
|
||||||
from dotenv import load_dotenv
|
from dotenv import load_dotenv
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from discord_webhook import DiscordWebhook
|
from discord_webhook import DiscordWebhook
|
||||||
|
|
||||||
import urllib, json, os, traceback, sys, re, subprocess, requests, io
|
import urllib
|
||||||
|
import json
|
||||||
|
import os
|
||||||
|
import traceback
|
||||||
|
import sys
|
||||||
|
import re
|
||||||
|
import subprocess
|
||||||
|
import requests
|
||||||
|
import io
|
||||||
|
|
||||||
# Load dotenv file if possible.
|
# Load dotenv file if possible.
|
||||||
# TODO: change all scripts to use named flags/params
|
# TODO: change all scripts to use named flags/params
|
||||||
|
@ -25,6 +32,7 @@ sc_precision = 10 ** 24
|
||||||
# Environment variable globals
|
# Environment variable globals
|
||||||
setup_done = False
|
setup_done = False
|
||||||
|
|
||||||
|
|
||||||
# find out local siad ip by inspecting its docker container
|
# find out local siad ip by inspecting its docker container
|
||||||
def get_docker_container_ip(container_name):
|
def get_docker_container_ip(container_name):
|
||||||
ip_regex = re.compile(r"^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$")
|
ip_regex = re.compile(r"^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$")
|
||||||
|
@ -41,6 +49,7 @@ api_endpoint = "http://{}:{}".format(
|
||||||
get_docker_container_ip(CONTAINER_NAME), os.getenv("API_PORT", "9980")
|
get_docker_container_ip(CONTAINER_NAME), os.getenv("API_PORT", "9980")
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
# find siad api password by getting it out of the docker container
|
# find siad api password by getting it out of the docker container
|
||||||
def get_api_password():
|
def get_api_password():
|
||||||
api_password_regex = re.compile(r"^\w+$")
|
api_password_regex = re.compile(r"^\w+$")
|
||||||
|
@ -56,7 +65,8 @@ def setup():
|
||||||
setup_done = True
|
setup_done = True
|
||||||
|
|
||||||
|
|
||||||
# send_msg sends the msg to the specified discord channel. If force_notify is set to true it adds "@here".
|
# send_msg sends the msg to the specified discord channel.
|
||||||
|
# If force_notify is set to true it adds "@here".
|
||||||
async def send_msg(msg, force_notify=False, file=None):
|
async def send_msg(msg, force_notify=False, file=None):
|
||||||
try:
|
try:
|
||||||
webhook_url = os.getenv("DISCORD_WEBHOOK_URL")
|
webhook_url = os.getenv("DISCORD_WEBHOOK_URL")
|
||||||
|
|
|
@ -5,9 +5,11 @@ funds-checker runs simple checks on a portal node using the siad API and
|
||||||
dispatches messages to a Discord channel.
|
dispatches messages to a Discord channel.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import traceback, asyncio, os
|
|
||||||
from bot_utils import setup, send_msg, siad, sc_precision
|
from bot_utils import setup, send_msg, siad, sc_precision
|
||||||
|
|
||||||
|
import traceback
|
||||||
|
import asyncio
|
||||||
|
|
||||||
setup()
|
setup()
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -105,7 +105,7 @@ async def check_disk():
|
||||||
)
|
)
|
||||||
inspect = os.popen("docker inspect sia").read().strip()
|
inspect = os.popen("docker inspect sia").read().strip()
|
||||||
inspect_json = json.loads(inspect)
|
inspect_json = json.loads(inspect)
|
||||||
if inspect_json[0]["State"]["Running"] == True:
|
if inspect_json[0]["State"]["Running"] is True:
|
||||||
# mark portal as unhealthy
|
# mark portal as unhealthy
|
||||||
os.popen("docker exec health-check cli/disable")
|
os.popen("docker exec health-check cli/disable")
|
||||||
time.sleep(300) # wait 5 minutes to propagate dns changes
|
time.sleep(300) # wait 5 minutes to propagate dns changes
|
||||||
|
@ -133,7 +133,10 @@ async def check_health():
|
||||||
res = requests.get(endpoint + "/health-check", verify=False)
|
res = requests.get(endpoint + "/health-check", verify=False)
|
||||||
json_check = res.json()
|
json_check = res.json()
|
||||||
|
|
||||||
server_failure = res.status_code is not requests.codes["ok"] and json_check["disabled"] == False:
|
server_failure = (
|
||||||
|
res.status_code is not requests.codes["ok"]
|
||||||
|
and json_check["disabled"] is False
|
||||||
|
)
|
||||||
|
|
||||||
res = requests.get(endpoint + "/health-check/critical", verify=False)
|
res = requests.get(endpoint + "/health-check/critical", verify=False)
|
||||||
json_critical = res.json()
|
json_critical = res.json()
|
||||||
|
@ -171,12 +174,12 @@ async def check_health():
|
||||||
bad = False
|
bad = False
|
||||||
for check in critical["checks"]:
|
for check in critical["checks"]:
|
||||||
critical_checks_total += 1
|
critical_checks_total += 1
|
||||||
if check["up"] == False:
|
if check["up"] is False:
|
||||||
critical_checks_failed += 1
|
critical_checks_failed += 1
|
||||||
bad = True
|
bad = True
|
||||||
if bad:
|
if bad:
|
||||||
critical["checks"] = [
|
critical["checks"] = [
|
||||||
check for check in critical["checks"] if check["up"] == False
|
check for check in critical["checks"] if check["up"] is False
|
||||||
]
|
]
|
||||||
failed_records.append(critical)
|
failed_records.append(critical)
|
||||||
|
|
||||||
|
@ -187,12 +190,12 @@ async def check_health():
|
||||||
bad = False
|
bad = False
|
||||||
for check in extended["checks"]:
|
for check in extended["checks"]:
|
||||||
extended_checks_total += 1
|
extended_checks_total += 1
|
||||||
if check["up"] == False:
|
if check["up"] is False:
|
||||||
extended_checks_failed += 1
|
extended_checks_failed += 1
|
||||||
bad = True
|
bad = True
|
||||||
if bad:
|
if bad:
|
||||||
extended["checks"] = [
|
extended["checks"] = [
|
||||||
check for check in extended["checks"] if check["up"] == False
|
check for check in extended["checks"] if check["up"] is False
|
||||||
]
|
]
|
||||||
failed_records.append(extended)
|
failed_records.append(extended)
|
||||||
|
|
||||||
|
@ -227,11 +230,7 @@ async def check_health():
|
||||||
failed_records_file = json.dumps(failed_records, indent=2)
|
failed_records_file = json.dumps(failed_records, indent=2)
|
||||||
|
|
||||||
# send a message if we force notification, there is a failures dump or just once daily (heartbeat) on 1 AM
|
# send a message if we force notification, there is a failures dump or just once daily (heartbeat) on 1 AM
|
||||||
if (
|
if force_notify or failed_records_file or datetime.utcnow().hour == 1:
|
||||||
force_notify
|
|
||||||
or failed_records_file
|
|
||||||
or datetime.utcnow().hour == 1
|
|
||||||
):
|
|
||||||
return await send_msg(
|
return await send_msg(
|
||||||
message, file=failed_records_file, force_notify=force_notify
|
message, file=failed_records_file, force_notify=force_notify
|
||||||
)
|
)
|
||||||
|
|
|
@ -1,9 +1,12 @@
|
||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
import sys, traceback, io, os, asyncio
|
from bot_utils import setup, send_msg
|
||||||
from bot_utils import setup, send_msg, upload_to_skynet
|
|
||||||
from subprocess import Popen, PIPE
|
from subprocess import Popen, PIPE
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import traceback
|
||||||
|
import asyncio
|
||||||
|
|
||||||
"""
|
"""
|
||||||
log-checker checks the docker logs for siad.
|
log-checker checks the docker logs for siad.
|
||||||
|
|
||||||
|
|
Reference in New Issue