diff --git a/.gitignore b/.gitignore index a70fa9b..affa59b 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ node_modules public/ static/admin/*.bundle.* .DS_Store +.env yarn-error.log gatsby-types.d.ts diff --git a/emails/contact/index.html b/emails/contact/index.html new file mode 100644 index 0000000..118fa0b --- /dev/null +++ b/emails/contact/index.html @@ -0,0 +1,31 @@ + + +
+

New message from the Idea Board

+

From: {{senderName}} ({{senderEmail}})

+

Regarding idea: {{ideaTitle}}

+
+

{{message}}

+
+

+ You can reply directly to {{senderName}} at + {{senderEmail}}. +

+
+ + diff --git a/gatsby-node.js b/gatsby-node.js index d441165..91c45a7 100644 --- a/gatsby-node.js +++ b/gatsby-node.js @@ -6,6 +6,7 @@ const { stringWithDefault, resolveToArray, resourceQuery, + alleniteQuery, } = require("./gatsby/utils/gatsby-resolver-utils"); const { RESOURCES_GATSBY_NODE_KEY, @@ -70,7 +71,24 @@ exports.createResolvers = ({ reporter, createResolvers }) => { ), }, authors: { - resolve: (source) => resolveToArray(source.authors), + resolve: async (source, _args, context) => { + const names = resolveToArray(source.authors); + const results = await Promise.all( + names + .filter(Boolean) + .map((name) => + context.nodeModel.findOne(alleniteQuery(name)), + ), + ); + return results.filter(Boolean); + }, + }, + primaryContact: { + resolve: async (source, _args, context) => { + const query = alleniteQuery(source.primaryContact); + if (!query) return null; + return context.nodeModel.findOne(query); + }, }, title: { resolve: (source) => @@ -128,8 +146,9 @@ exports.createPages = ({ actions, graphql }) => { // Create pages for any markdown files that are configured to have their // own node type (e.g. Resource) based on their templateKey. - const typedNodePages = Object.keys(TEMPLATE_KEY_TO_TYPE).map( - (templateKey) => { + const typedNodePages = Object.keys(TEMPLATE_KEY_TO_TYPE) + .filter((templateKey) => !DATA_ONLY_PAGES.includes(templateKey)) + .map((templateKey) => { const nodeKey = TEMPLATE_KEY_TO_TYPE[templateKey]; const allKeyString = `all${nodeKey}`; return graphql(` diff --git a/gatsby/constants.js b/gatsby/constants.js index d086e08..385c963 100644 --- a/gatsby/constants.js +++ b/gatsby/constants.js @@ -3,6 +3,7 @@ const PROGRAM_TEMPLATE_KEY = `program`; const RESOURCES_TEMPLATE_KEY = `resource`; const RESOURCES_GATSBY_NODE_KEY = `Resource`; +const ALLENITE_GATSBY_NODE_KEY = `Allenite`; const MARKDOWN_REMARK_GATSBY_NODE_KEY = `MarkdownRemark`; /** @@ -14,6 +15,7 @@ const MARKDOWN_REMARK_GATSBY_NODE_KEY = `MarkdownRemark`; */ const TEMPLATE_KEY_TO_TYPE = { [RESOURCES_TEMPLATE_KEY]: RESOURCES_GATSBY_NODE_KEY, + [ALLENITE_TEMPLATE_KEY]: ALLENITE_GATSBY_NODE_KEY, }; module.exports = { ALLENITE_TEMPLATE_KEY, @@ -22,4 +24,5 @@ module.exports = { MARKDOWN_REMARK_GATSBY_NODE_KEY, TEMPLATE_KEY_TO_TYPE, RESOURCES_GATSBY_NODE_KEY, + ALLENITE_GATSBY_NODE_KEY, }; diff --git a/gatsby/schema/base.gql b/gatsby/schema/base.gql index 6aafc1d..c692e8a 100644 --- a/gatsby/schema/base.gql +++ b/gatsby/schema/base.gql @@ -14,13 +14,13 @@ type Frontmatter { description: String draft: Boolean tags: [String!] - authors: [String!]! + authors: [Allenite!]! nextSteps: String program: [String!] publication: String introduction: String resources: [Resource!]! - primaryContact: String + primaryContact: Allenite } type Resource implements Node { @@ -35,4 +35,13 @@ type Resource implements Node { date: Date @dateformat tags: [String!] draft: Boolean -} \ No newline at end of file +} + +type Allenite implements Node { + slug: String! + name: String! + contactId: String + position: String + contact: String + program: [String!] +} diff --git a/gatsby/utils/gatsby-resolver-utils.js b/gatsby/utils/gatsby-resolver-utils.js index 71099c4..a14bef0 100644 --- a/gatsby/utils/gatsby-resolver-utils.js +++ b/gatsby/utils/gatsby-resolver-utils.js @@ -1,6 +1,7 @@ const { RESOURCES_TEMPLATE_KEY, TEMPLATE_KEY_TO_TYPE, + ALLENITE_TEMPLATE_KEY, } = require("../constants"); const slugify = require("slugify"); @@ -47,23 +48,30 @@ const resolveSlug = (id, directory) => { }; /** - * Builds a nodeModel query for a single Resource node by display name. - * Returns null if the name can't be slugified (falsy input). - * @param {string|null|undefined} name - The resource's name (e.g., "Software Y") - * @returns {{ query: object, type: string } | null} + * Builds a nodeModel query for a single node by display name and template key. + * Uses slugs in place of names to prevent namespace collisions when querying + * via Gatsby's nodeModel. Returns null if the name can't be slugified (falsy input). + * @param {string|null|undefined} name - The node's display name (e.g., "Software Y", "Jane Smith") + * @param {string} templateKey - The template key used for slug resolution and type lookup (e.g., RESOURCES_TEMPLATE_KEY) + * @returns {{ query: object, type: string } | null} A nodeModel-compatible query/type pair, or null */ -const resourceQuery = (name) => { - const slug = resolveSlug(name, RESOURCES_TEMPLATE_KEY); +const buildNodeQuery = (name, templateKey) => { + const slug = resolveSlug(name, templateKey); if (!slug) return null; return { query: { filter: { slug: { eq: slug } } }, - type: TEMPLATE_KEY_TO_TYPE[RESOURCES_TEMPLATE_KEY], // "Resource" + type: TEMPLATE_KEY_TO_TYPE[templateKey], }; }; +const resourceQuery = (name) => buildNodeQuery(name, RESOURCES_TEMPLATE_KEY); +const alleniteQuery = (name) => buildNodeQuery(name, ALLENITE_TEMPLATE_KEY); + module.exports = { stringWithDefault, resolveToArray, resolveSlug, resourceQuery, + alleniteQuery, + buildNodeQuery, }; diff --git a/netlify.toml b/netlify.toml index 6b324a0..a58b6c4 100644 --- a/netlify.toml +++ b/netlify.toml @@ -1,6 +1,10 @@ [build] publish = "public" command = "npm run build" + package = "@netlify/plugin-gatsby" +[[plugins]] + package = "@netlify/plugin-emails" + [build.environment] NODE_VERSION = "22.16.0" YARN_VERSION = "1.22.4" diff --git a/netlify/functions/contact.mts b/netlify/functions/contact.mts index 66db490..6e711db 100644 --- a/netlify/functions/contact.mts +++ b/netlify/functions/contact.mts @@ -1,24 +1,206 @@ -import type { Handler } from "@netlify/functions"; +/** + * Contact form handler. + * + * Recipient email lookup: + * recipientId from the request body is matched against the `id` column of a + * Google Sheet to resolve the recipient's email. The sheet is expected to + * have a header row and columns: A=id, B=name, C=email, D=githubid. + * + * Required env vars: + * CONTACTS_SHEET_ID — spreadsheet ID (from the sheet URL) + * GOOGLE_SERVICE_ACCOUNT_EMAIL — service account client_email + * GOOGLE_SERVICE_ACCOUNT_PRIVATE_KEY — service account private_key (PEM) + * + * The sheet must be shared (at least Viewer) with the service account email. + * + * Email sending: + * Uses the Netlify Email Integration with Mailgun. The integration must be + * configured with the required env vars. + * see: https://docs.netlify.com/extend/install-and-use/setup-guides/email-integration/#required-environment-variables + * The email template lives at emails/contact/index.html. + */ -const handler: Handler = async function (event) { - if (event.body === null) { - return { - statusCode: 400, - body: JSON.stringify("Payload required"), - }; +import { createSign } from "node:crypto"; + +interface ContactRequest { + senderName: string; + senderEmail: string; + recipientName: string; + recipientId: string; + message: string; + ideaTitle?: string; +} + +// user@domain.tld — no whitespace, requires exactly one @, at least one dot in domain +const EMAIL_RE = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; +// CR/LF in header-interpolated fields enables email header injection +const HEADER_INJECTION_RE = /[\r\n]/; + +function validateRequest(body: unknown): body is ContactRequest { + if (typeof body !== "object" || body === null) return false; + const b = body as Record; + return ( + typeof b.senderName === "string" && b.senderName.length > 0 && + !HEADER_INJECTION_RE.test(b.senderName) && + typeof b.senderEmail === "string" && EMAIL_RE.test(b.senderEmail) && + typeof b.recipientName === "string" && b.recipientName.length > 0 && + typeof b.recipientId === "string" && b.recipientId.length > 0 && + typeof b.message === "string" && b.message.length > 0 + ); +} + +async function getSheetsAccessToken(): Promise { + const clientEmail = process.env.GOOGLE_SERVICE_ACCOUNT_EMAIL; + const rawKey = process.env.GOOGLE_SERVICE_ACCOUNT_PRIVATE_KEY; + if (!clientEmail || !rawKey) { + throw new Error("Google service account credentials missing"); } + // Netlify may store the key with literal \n escapes; normalize to real newlines. + const privateKey = rawKey.replace(/\\n/g, "\n"); - const requestBody = JSON.parse(event.body) as { - senderName: string; - senderEmail: string; - recipient: string; - message: string; + const now = Math.floor(Date.now() / 1000); + const header = { alg: "RS256", typ: "JWT" }; + const claim = { + iss: clientEmail, + scope: "https://www.googleapis.com/auth/spreadsheets.readonly", + aud: "https://oauth2.googleapis.com/token", + exp: now + 3600, + iat: now, }; + const encode = (obj: object) => + Buffer.from(JSON.stringify(obj)).toString("base64url"); + const unsigned = `${encode(header)}.${encode(claim)}`; + const signer = createSign("RSA-SHA256"); + signer.update(unsigned); + const signature = signer.sign(privateKey).toString("base64url"); + const jwt = `${unsigned}.${signature}`; - return { - statusCode: 200, - body: JSON.stringify(requestBody), - }; -}; + const tokenRes = await fetch("https://oauth2.googleapis.com/token", { + method: "POST", + headers: { "Content-Type": "application/x-www-form-urlencoded" }, + body: new URLSearchParams({ + grant_type: "urn:ietf:params:oauth:grant-type:jwt-bearer", + assertion: jwt, + }), + }); + if (!tokenRes.ok) { + throw new Error(`Google token exchange failed: ${tokenRes.status}`); + } + const data = (await tokenRes.json()) as { access_token?: string }; + if (!data.access_token) { + throw new Error("Google token response missing access_token"); + } + return data.access_token; +} + +async function lookupRecipientEmail(recipientId: string): Promise { + const sheetId = process.env.CONTACTS_SHEET_ID; + if (!sheetId) throw new Error("CONTACTS_SHEET_ID missing"); + const token = await getSheetsAccessToken(); + const range = encodeURIComponent("Sheet1!A:C"); + const res = await fetch( + `https://sheets.googleapis.com/v4/spreadsheets/${sheetId}/values/${range}`, + { headers: { Authorization: `Bearer ${token}` } } + ); + if (!res.ok) { + throw new Error(`Sheets read failed: ${res.status}`); + } + const data = (await res.json()) as { values?: string[][] }; + const rows = data.values ?? []; + for (let i = 1; i < rows.length; i++) { + const [id, , email] = rows[i]; + if (id === recipientId && email) return email; + } + return undefined; +} + +export default async function (request: Request) { + if (request.method !== "POST") { + return new Response(JSON.stringify("Method not allowed"), { status: 405 }); + } + + let body: unknown; + try { + body = await request.json(); + } catch { + return new Response(JSON.stringify("Invalid JSON"), { status: 400 }); + } + + if (!validateRequest(body)) { + return new Response(JSON.stringify("Missing or invalid fields"), { status: 400 }); + } + + let recipientEmail: string | undefined; + try { + recipientEmail = await lookupRecipientEmail(body.recipientId); + } catch (error) { + console.error("Contact lookup failed:", error); + return new Response( + JSON.stringify("Contact lookup failed"), + { status: 502 } + ); + } + if (!recipientEmail) { + return new Response( + JSON.stringify("No email stored for submitted contact ID"), + { status: 400 } + ); + } + + const baseUrl = new URL(request.url).origin; + const emailsSecret = process.env.NETLIFY_EMAILS_SECRET; + const from = process.env.NETLIFY_EMAILS_FROM + ?? (process.env.NETLIFY_EMAILS_MAILGUN_DOMAIN + ? `noreply@${process.env.NETLIFY_EMAILS_MAILGUN_DOMAIN}` + : undefined); + + if (!emailsSecret || !from) { + console.error("Email service misconfigured:", { emailsSecret: !!emailsSecret, from: !!from }); + return new Response( + JSON.stringify("Email service not configured"), + { status: 500 } + ); + } + + let emailResponse: Response; + try { + emailResponse = await fetch( + `${baseUrl}/.netlify/functions/emails/contact`, + { + method: "POST", + headers: { + "netlify-emails-secret": emailsSecret, + }, + body: JSON.stringify({ + from, + reply_to: body.senderEmail, + to: recipientEmail, + subject: `Idea Board: message from ${body.senderName}`, + parameters: { + senderName: body.senderName, + senderEmail: body.senderEmail, + message: body.message, + ideaTitle: body.ideaTitle ?? "N/A", + }, + }), + } + ); + } catch (error) { + console.error("Error calling email function:", error); + return new Response( + JSON.stringify("Failed to send email"), + { status: 502 } + ); + } + + if (!emailResponse.ok) { + const errorText = await emailResponse.text(); + console.error("Email send failed:", emailResponse.status, errorText); + return new Response( + JSON.stringify("Failed to send email"), + { status: 502 } + ); + } -export { handler }; + return new Response(JSON.stringify("Message sent"), { status: 200 }); +} diff --git a/package.json b/package.json index 8867761..a3e81f8 100644 --- a/package.json +++ b/package.json @@ -58,6 +58,8 @@ }, "devDependencies": { "@eslint/js": "^10.0.1", + "@netlify/plugin-emails": "^1.1.1", + "@netlify/plugin-gatsby": "^3.8.4", "@trivago/prettier-plugin-sort-imports": "^6.0.2", "@types/antd": "^1.0.0", "@types/node": "^20.11.20", @@ -80,4 +82,4 @@ "engines": { "node": ">= 18.15.0" } -} \ No newline at end of file +} diff --git a/src/components/ContactModal.tsx b/src/components/ContactModal.tsx index 727a1c0..3a1dd75 100644 --- a/src/components/ContactModal.tsx +++ b/src/components/ContactModal.tsx @@ -1,13 +1,16 @@ import React, { useState } from "react"; +import { graphql, useStaticQuery } from "gatsby"; + import { Button, Flex, Input, Modal } from "antd"; import { CONTACT_FUNCTION_PATH } from "../constants"; +import { Allenite } from "../types"; interface ContactModalProps { - authors: readonly (string | null)[] | null | undefined; + authors: ReadonlyArray | null; open: boolean; - primaryContact: string | null | undefined; + primaryContact: Allenite | null; title: string; onClose: () => void; } @@ -23,20 +26,38 @@ export const ContactModal: React.FC = ({ const [senderEmail, setSenderEmail] = useState(""); const [message, setMessage] = useState(""); + const defaultContactQueryData = useStaticQuery(graphql` + query DefaultContact { + allenite(name: { eq: "Idea Board" }) { + name + contactId + } + } + `); + const hasPrimaryContact = !!primaryContact; const hasAuthors = !!authors && authors.length > 0; const filteredAuthors = - authors?.filter(Boolean).join(", ") ?? "the authors"; + authors + ?.map((author) => author.name) + .filter(Boolean) + .join(", ") ?? "the authors"; - const recipientLabel = hasPrimaryContact + const defaultContact = defaultContactQueryData.allenite; + const preferredRecipient = hasPrimaryContact ? primaryContact : hasAuthors - ? filteredAuthors - : // TODO use real contact info - "fake default email inbox"; + ? authors[0] + : null; + const recipient = preferredRecipient?.contactId + ? preferredRecipient + : defaultContact; + + const hasRecipient = !!recipient?.name && !!recipient?.contactId; const handleSubmit = async () => { + if (!hasRecipient) return; try { const response = await fetch(CONTACT_FUNCTION_PATH, { method: "POST", @@ -46,8 +67,10 @@ export const ContactModal: React.FC = ({ body: JSON.stringify({ senderName: senderName, senderEmail: senderEmail, - recipient: recipientLabel, + recipientName: recipient.name, + recipientId: recipient.contactId, message: message, + ideaTitle: title, }), }); @@ -70,7 +93,12 @@ export const ContactModal: React.FC = ({ , - , ]} @@ -83,11 +111,15 @@ export const ContactModal: React.FC = ({ Authors: {filteredAuthors}

)} -

- Your message will be sent to {recipientLabel}. - Reach out with questions, collaboration interest, or feedback on - this idea. -

+ {hasRecipient ? ( +

+ Your message will be sent to{" "} + {recipient.name}. Reach out with questions, + collaboration interest, or feedback on this idea. +

+ ) : ( +

No contact is available for this idea right now.

+ )} = ({ figure }) => { - if (!figure.url && !figure.file) { + if (!figure || (!figure.url && !figure.file)) { return null; } diff --git a/src/components/IdeaRoll.tsx b/src/components/IdeaRoll.tsx index 5b4660d..5775eab 100644 --- a/src/components/IdeaRoll.tsx +++ b/src/components/IdeaRoll.tsx @@ -6,7 +6,7 @@ import { MessageOutlined, StarOutlined } from "@ant-design/icons"; import { useLocation } from "@reach/router"; import { Avatar, List, Space } from "antd"; -import { ResourceNode } from "../types"; +import { Allenite, ResourceNode } from "../types"; import { IconText } from "./IconText"; import { TagPopover } from "./TagPopover"; @@ -25,7 +25,7 @@ interface PostNode { templateKey: string; concerns?: string; program: string; - authors?: string[]; + authors?: Allenite[]; tags?: string[]; type: string; resources: ResourceNode[]; @@ -111,12 +111,12 @@ const IdeaRollTemplate = (props: { {item.authors.map((author) => ( - {author[0].toUpperCase()} + {author.name[0].toUpperCase()} ))} @@ -172,7 +172,10 @@ export default function IdeaRoll({ date(formatString: "MMMM DD, YYYY") tags type - authors + authors { + name + contactId + } concerns resources { ...ResourceFields diff --git a/src/pages/allenite/caroline-hookway.md b/src/pages/allenite/caroline-hookway.md index 42a26c5..6c91121 100644 --- a/src/pages/allenite/caroline-hookway.md +++ b/src/pages/allenite/caroline-hookway.md @@ -5,4 +5,5 @@ position: Senior Scientist contact: https://forum.allencell.org/ program: - EMT +contactId: CAROLINE --- diff --git a/src/pages/allenite/name.md b/src/pages/allenite/gokhan-dalgin.md similarity index 81% rename from src/pages/allenite/name.md rename to src/pages/allenite/gokhan-dalgin.md index b99d1dd..c6c5ebe 100644 --- a/src/pages/allenite/name.md +++ b/src/pages/allenite/gokhan-dalgin.md @@ -2,4 +2,5 @@ templateKey: allenite name: Gokhan Dalgin position: Senior Scientist +contactId: GOKHAN --- diff --git a/src/pages/allenite/idea-board.md b/src/pages/allenite/idea-board.md new file mode 100644 index 0000000..675df97 --- /dev/null +++ b/src/pages/allenite/idea-board.md @@ -0,0 +1,6 @@ +--- +templateKey: allenite +name: Idea Board +position: Shared Inbox +contactId: CONTACT_IDEA_BOARD +--- diff --git a/src/pages/allenite/name-1.md b/src/pages/allenite/megan-riel-mehan.md similarity index 82% rename from src/pages/allenite/name-1.md rename to src/pages/allenite/megan-riel-mehan.md index c15d071..3500fd7 100644 --- a/src/pages/allenite/name-1.md +++ b/src/pages/allenite/megan-riel-mehan.md @@ -2,4 +2,5 @@ templateKey: allenite name: Megan Riel-Mehan position: Senior Scientist +contactId: MEGAN --- diff --git a/src/pages/ideas/dev-example.md b/src/pages/ideas/dev-example.md index a734a48..690bfe6 100644 --- a/src/pages/ideas/dev-example.md +++ b/src/pages/ideas/dev-example.md @@ -16,7 +16,7 @@ date: 2025-10-28T19:10:00.000Z authors: - Gokhan Dalgin - Caroline Hookway -primaryContact: Megan Riel-Mehan +primaryContact: Idea Board program: EMT introduction: > Collective cell migration during EMT appears to be preceded by subtle diff --git a/src/templates/idea-post.tsx b/src/templates/idea-post.tsx index bb2d6de..72df0e3 100644 --- a/src/templates/idea-post.tsx +++ b/src/templates/idea-post.tsx @@ -11,7 +11,7 @@ import { CustomReactMarkdown } from "../components/CustomReactMarkdown"; import FigureComponent from "../components/Figure"; import { MaterialsAndMethodsComponent } from "../components/MaterialsAndMethods"; import { TagPopover } from "../components/TagPopover"; -import { IdeaFields, IdeaFrontmatter, IdeaPostQuery } from "../types"; +import { Allenite, IdeaFields, IdeaFrontmatter, IdeaPostQuery } from "../types"; const Header = AntdLayout.Header; @@ -50,14 +50,15 @@ export const IdeaPostTemplate: React.FC = ({ ); }; - const getAuthorsList = (authors: readonly string[]) => { + const getAuthorsList = (authors: Allenite[]) => { if (authors.length === 0) { return null; } + const names = authors.map((author) => author.name); return ( <>

Proposed by:

-

{authors.join(", ")}

+

{names.join(", ")}

); }; @@ -101,7 +102,7 @@ export const IdeaPostTemplate: React.FC = ({ )} - {getAuthorsList(authors)} + {getAuthorsList([...authors])} {publication && ( <>

Publication

@@ -180,13 +181,19 @@ export const pageQuery = graphql` slug } frontmatter { - authors publication date(formatString: "MMMM DD, YYYY") introduction title description - primaryContact + authors { + name + contactId + } + primaryContact { + name + contactId + } tags preliminaryFindings { summary diff --git a/src/types/index.ts b/src/types/index.ts index 10dcd01..f3a5498 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -17,6 +17,8 @@ export type IdeaPostNode = NonNullable; export type IdeaFrontmatter = NonNullable; export type IdeaFields = NonNullable; +export type Allenite = NonNullable; + export type IdeasForTags = Queries.AllIdeasForTagsQuery["allMarkdownRemark"]["edges"]; diff --git a/yarn.lock b/yarn.lock index a8240b6..e8da0d5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2249,6 +2249,11 @@ resolved "https://registry.yarnpkg.com/@graphql-typed-document-node/core/-/core-3.2.0.tgz#5f3d96ec6b2354ad6d8a28bf216a1d97b5426861" integrity sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ== +"@hapi/bourne@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@hapi/bourne/-/bourne-3.0.0.tgz#f11fdf7dda62fe8e336fa7c6642d9041f30356d7" + integrity sha512-Waj1cwPXJDucOib4a3bAISsKJVb15MKi9IvmTI/7ssVEm6sywXGjVJDhl6/umt1pK1ZS7PacXU3A1PmFKHEZ2w== + "@hapi/hoek@^9.0.0", "@hapi/hoek@^9.3.0": version "9.3.0" resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb" @@ -2318,6 +2323,11 @@ resolved "https://registry.yarnpkg.com/@import-maps/resolve/-/resolve-1.0.1.tgz#1e9fcadcf23aa0822256a329aabca241879d37c9" integrity sha512-tWZNBIS1CoekcwlMuyG2mr0a1Wo5lb5lEHwwWvZo+5GLgr3e9LLDTtmgtCWEwBpXMkxn9D+2W9j2FY6eZQq0tA== +"@ioredis/commands@1.5.1": + version "1.5.1" + resolved "https://registry.yarnpkg.com/@ioredis/commands/-/commands-1.5.1.tgz#a0a3449993b10c7aeb91ecb0d5f1a23692297e51" + integrity sha512-JH8ZL/ywcJyR9MmJ5BNqZllXNZQqQbnVZOqpPQqE1vHiFgAw4NHbvE0FOduNU8IX9babitBT46571OnPTT0Zcw== + "@isaacs/cliui@^8.0.2": version "8.0.2" resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" @@ -2801,6 +2811,20 @@ cpy "^9.0.0" path-exists "^5.0.0" +"@netlify/functions@^1.2.0", "@netlify/functions@^1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@netlify/functions/-/functions-1.6.0.tgz#c373423e6fef0e6f7422ac0345e8bbf2cb692366" + integrity sha512-6G92AlcpFrQG72XU8YH8pg94eDnq7+Q0YJhb8x4qNpdGsvuzvrfHWBmqFGp/Yshmv4wex9lpsTRZOocdrA2erQ== + dependencies: + is-promise "^4.0.0" + +"@netlify/functions@^2.4.0": + version "2.8.2" + resolved "https://registry.yarnpkg.com/@netlify/functions/-/functions-2.8.2.tgz#653395b901a74a6189e913a089f9cb90083ca6ce" + integrity sha512-DeoAQh8LuNPvBE4qsKlezjKj0PyXDryOFJfJKo3Z1qZLKzQ21sT314KQKPVjfvw6knqijj+IO+0kHXy/TJiqNA== + dependencies: + "@netlify/serverless-functions-api" "1.26.1" + "@netlify/functions@^5.1.2": version "5.1.2" resolved "https://registry.yarnpkg.com/@netlify/functions/-/functions-5.1.2.tgz#a18a141c989f3c5e6963d5d4c0613f106854ae0c" @@ -2831,6 +2855,22 @@ map-obj "^5.0.0" path-exists "^5.0.0" +"@netlify/ipx@^1.4.6": + version "1.4.6" + resolved "https://registry.yarnpkg.com/@netlify/ipx/-/ipx-1.4.6.tgz#0bd308d70a1d2e1928e66cb49e36294f66f7b8b2" + integrity sha512-rnKR2LXhtnflitPX9CQIv+XSrNlYIqGsV54xrXifhbtHHjCjCw/lixsi8qwAXqEIgZBC9b4Y7prhHqRtC4oIjw== + dependencies: + "@netlify/functions" "^2.4.0" + etag "^1.8.1" + fs-extra "^11.0.0" + ipx "^1.3.1" + micromatch "^4.0.5" + mkdirp "^3.0.0" + murmurhash "^2.0.0" + node-fetch "^2.0.0" + ufo "^1.0.0" + unstorage "1.9.0" + "@netlify/local-functions-proxy-darwin-arm64@1.1.1": version "1.1.1" resolved "https://registry.yarnpkg.com/@netlify/local-functions-proxy-darwin-arm64/-/local-functions-proxy-darwin-arm64-1.1.1.tgz#c83a0a142637fb8cefe25c95f5c5cf6f2d7e32ed" @@ -2909,6 +2949,11 @@ "@netlify/local-functions-proxy-win32-ia32" "1.1.1" "@netlify/local-functions-proxy-win32-x64" "1.1.1" +"@netlify/node-cookies@^0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@netlify/node-cookies/-/node-cookies-0.1.0.tgz#dda912ba618527695cf519fafa221c5e6777c612" + integrity sha512-OAs1xG+FfLX0LoRASpqzVntVV/RpYkgpI0VrUnw2u0Q1qiZUzcPffxRK8HF3gc4GjuhG5ahOEMJ9bswBiZPq0g== + "@netlify/open-api@^2.35.0", "@netlify/open-api@^2.37.0": version "2.37.0" resolved "https://registry.yarnpkg.com/@netlify/open-api/-/open-api-2.37.0.tgz#fe2896f993d07e1a881a671b121d0f0dbae6a3c2" @@ -2919,6 +2964,39 @@ resolved "https://registry.yarnpkg.com/@netlify/opentelemetry-utils/-/opentelemetry-utils-1.3.1.tgz#b90711acdf3e41df828e184cf8c715f83bb1f85a" integrity sha512-WAzYBrRQdPw+2JWRESxmUwBSOnUGGgBh4l9GvNmMCxa/ecLw42MhNIONETZ+j2hvQd9T7qRxHece/QREgF9J0g== +"@netlify/plugin-emails@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@netlify/plugin-emails/-/plugin-emails-1.1.1.tgz#befb33a77868ac0f131dc5e1e5d45532ec96e45c" + integrity sha512-SXiPGTYlGX+xE+XKNFoyOh1Cxr/fJTHsjtmuD99femruA9nqUzpd5qasVmZxm8zbWyVlihS00Ctvfs9hVh2whA== + dependencies: + "@netlify/functions" "^1.2.0" + https "^1.0.0" + path "^0.12.7" + tslib "^2.4.0" + +"@netlify/plugin-gatsby@^3.8.4": + version "3.8.4" + resolved "https://registry.yarnpkg.com/@netlify/plugin-gatsby/-/plugin-gatsby-3.8.4.tgz#9fd65649d18be016338f602d81e767e53c60a6d7" + integrity sha512-eYrLvV0IkVnEysxshvbxIhSCTkVzZQHjuP2xKdsc1vRuFOIl2jGLaNdPNjPH6MH0jDP8Bd+prhQ7etg1u0qveg== + dependencies: + "@netlify/functions" "^1.6.0" + "@netlify/ipx" "^1.4.6" + abortcontroller-polyfill "^1.7.3" + chalk "^4.1.2" + co-body "^6.1.0" + cookie "^0.7.0" + etag "^1.8.1" + fs-extra "^10.0.0" + linkfs "^2.1.0" + multer "^2.0.0" + node-fetch "^2.6.1" + node-stream-zip "^1.15.0" + pathe "^0.3.0" + pretty-bytes "^5.6.0" + semver "^7.3.5" + statuses "^2.0.1" + uuid "^9.0.0" + "@netlify/plugins-list@^6.80.0": version "6.80.0" resolved "https://registry.yarnpkg.com/@netlify/plugins-list/-/plugins-list-6.80.0.tgz#da45e4f67e41e1623cd002273f8e6b2aea68ba8a" @@ -2953,6 +3031,14 @@ dependencies: execa "^6.0.0" +"@netlify/serverless-functions-api@1.26.1": + version "1.26.1" + resolved "https://registry.yarnpkg.com/@netlify/serverless-functions-api/-/serverless-functions-api-1.26.1.tgz#6d2792a7fdbb3a6b852c219e4fb13622b30a9ec5" + integrity sha512-q3L9i3HoNfz0SGpTIS4zTcKBbRkxzCRpd169eyiTuk3IwcPC3/85mzLHranlKo2b+HYT0gu37YxGB45aD8A3Tw== + dependencies: + "@netlify/node-cookies" "^0.1.0" + urlpattern-polyfill "8.0.2" + "@netlify/serverless-functions-api@^1.31.1", "@netlify/serverless-functions-api@^1.41.1": version "1.41.1" resolved "https://registry.yarnpkg.com/@netlify/serverless-functions-api/-/serverless-functions-api-1.41.1.tgz#ea8fe44280a8e73b7053512ce6ad689bab296e94" @@ -4947,7 +5033,7 @@ abort-controller@^3.0.0: dependencies: event-target-shim "^5.0.0" -abortcontroller-polyfill@^1.1.9: +abortcontroller-polyfill@^1.1.9, abortcontroller-polyfill@^1.7.3: version "1.7.8" resolved "https://registry.yarnpkg.com/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.8.tgz#fe8d4370403f02e2aa37e3d2b0b178bae9d83f49" integrity sha512-9f1iZ2uWh92VcrU9Y8x+LdM4DLj75VE0MJB8zuF1iUnroEptStw+DQ8EQPMUdfe5k+PkB1uUfDQfWbhstH8LrQ== @@ -6175,7 +6261,7 @@ builtins@^5.0.0: dependencies: semver "^7.0.0" -busboy@^1.0.0: +busboy@^1.0.0, busboy@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== @@ -6187,7 +6273,7 @@ byline@^5.0.0: resolved "https://registry.yarnpkg.com/byline/-/byline-5.0.0.tgz#741c5216468eadc457b03410118ad77de8c1ddb1" integrity sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q== -bytes@3.1.2: +bytes@3.1.2, bytes@~3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== @@ -6718,6 +6804,22 @@ clsx@^1.1.1: resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.2.1.tgz#0ddc4a20a549b59c93a4116bb26f5294ca17dc12" integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== +cluster-key-slot@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz#88ddaa46906e303b5de30d3153b7d9fe0a0c19ac" + integrity sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA== + +co-body@^6.1.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/co-body/-/co-body-6.2.0.tgz#afd776d60e5659f4eee862df83499698eb1aea1b" + integrity sha512-Kbpv2Yd1NdL1V/V4cwLVxraHDV6K8ayohr2rmH0J87Er8+zJjcTa6dAn9QMPC9CRgU8+aNajKbSf1TzDB1yKPA== + dependencies: + "@hapi/bourne" "^3.0.0" + inflation "^2.0.0" + qs "^6.5.2" + raw-body "^2.3.3" + type-is "^1.6.16" + codemirror@^5.46.0: version "5.65.19" resolved "https://registry.yarnpkg.com/codemirror/-/codemirror-5.65.19.tgz#71016c701d6a4b6e1982b0f6e7186be65e49653d" @@ -6961,6 +7063,16 @@ concat-stream@^1.5.2: readable-stream "^2.2.2" typedarray "^0.0.6" +concat-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-2.0.0.tgz#414cf5af790a48c60ab9be4527d56d5e41133cb1" + integrity sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^3.0.2" + typedarray "^0.0.6" + concordance@5.0.4: version "5.0.4" resolved "https://registry.yarnpkg.com/concordance/-/concordance-5.0.4.tgz#9896073261adced72f88d60e4d56f8efc4bbbbd2" @@ -7331,7 +7443,7 @@ cross-spawn@^7.0.2, cross-spawn@^7.0.3, cross-spawn@^7.0.6: shebang-command "^2.0.0" which "^2.0.1" -"crossws@>=0.2.0 <0.4.0", crossws@^0.3.4: +"crossws@>=0.2.0 <0.4.0", crossws@^0.3.4, crossws@^0.3.5: version "0.3.5" resolved "https://registry.yarnpkg.com/crossws/-/crossws-0.3.5.tgz#daad331d44148ea6500098bc858869f3a5ab81a6" integrity sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA== @@ -8074,7 +8186,7 @@ define-properties@^1.1.3, define-properties@^1.2.1: has-property-descriptors "^1.0.0" object-keys "^1.1.1" -defu@^6.1.4: +defu@^6.1.2, defu@^6.1.4: version "6.1.4" resolved "https://registry.yarnpkg.com/defu/-/defu-6.1.4.tgz#4e0c9cf9ff68fe5f3d7f2765cc1a012dfdcb0479" integrity sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg== @@ -8089,7 +8201,12 @@ delegates@^1.0.0: resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== -depd@2.0.0: +denque@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/denque/-/denque-2.1.0.tgz#e93e1a6569fb5e66f16a3c2a2964617d349d6ab1" + integrity sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw== + +depd@2.0.0, depd@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== @@ -8114,7 +8231,7 @@ dequal@^2.0.0: resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== -destr@^2.0.2, destr@^2.0.3, destr@^2.0.5: +destr@^2.0.1, destr@^2.0.2, destr@^2.0.3, destr@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/destr/-/destr-2.0.5.tgz#7d112ff1b925fb8d2079fac5bdb4a90973b51fdb" integrity sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA== @@ -10107,6 +10224,15 @@ fs-exists-cached@1.0.0, fs-exists-cached@^1.0.0: resolved "https://registry.yarnpkg.com/fs-exists-cached/-/fs-exists-cached-1.0.0.tgz#cf25554ca050dc49ae6656b41de42258989dcbce" integrity sha512-kSxoARUDn4F2RPXX48UXnaFKwVU7Ivd/6qpzZL29MCDmr9sTvybv4gFCp+qaI4fM9m0z9fgz/yJvi56GAz+BZg== +fs-extra@^10.0.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + fs-extra@^11.0.0, fs-extra@^11.2.0: version "11.3.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.3.0.tgz#0daced136bbaf65a555a326719af931adc7a314d" @@ -11190,6 +11316,21 @@ h3@^1.10.0, h3@^1.12.0, h3@^1.15.2: ufo "^1.6.1" uncrypto "^0.1.3" +h3@^1.7.1: + version "1.15.10" + resolved "https://registry.yarnpkg.com/h3/-/h3-1.15.10.tgz#defe650df7b70cf585d2020c4146fb580cfb0d42" + integrity sha512-YzJeWSkDZxAhvmp8dexjRK5hxziRO7I9m0N53WhvYL5NiWfkUkzssVzY9jvGu0HBoLFW6+duYmNSn6MaZBCCtg== + dependencies: + cookie-es "^1.2.2" + crossws "^0.3.5" + defu "^6.1.4" + destr "^2.0.5" + iron-webcrypto "^1.2.1" + node-mock-http "^1.0.4" + radix3 "^1.1.2" + ufo "^1.6.3" + uncrypto "^0.1.3" + has-bigints@^1.0.2: version "1.1.0" resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.1.0.tgz#28607e965ac967e03cd2a2c70a2636a1edad49fe" @@ -11623,6 +11764,17 @@ http-errors@~1.8.1: statuses ">= 1.5.0 < 2" toidentifier "1.0.1" +http-errors@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.1.tgz#36d2f65bc909c8790018dd36fb4d93da6caae06b" + integrity sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ== + dependencies: + depd "~2.0.0" + inherits "~2.0.4" + setprototypeof "~1.2.0" + statuses "~2.0.2" + toidentifier "~1.0.1" + http-proxy-middleware@2.0.7: version "2.0.7" resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz#915f236d92ae98ef48278a95dedf17e991936ec6" @@ -11680,6 +11832,11 @@ https-proxy-agent@^5.0.0: agent-base "6" debug "4" +https@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https/-/https-1.0.0.tgz#3c37c7ae1a8eeb966904a2ad1e975a194b7ed3a4" + integrity sha512-4EC57ddXrkaF0x83Oj8sM6SLQHAWXw90Skqu2M4AEWENZ3F02dFJE/GARA8igO79tcgYqGrD7ae4f5L3um2lgg== + human-signals@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" @@ -11700,7 +11857,7 @@ human-signals@^5.0.0: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-5.0.0.tgz#42665a284f9ae0dade3ba41ebc37eb4b852f3a28" integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ== -iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4: +iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4, iconv-lite@~0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -11739,6 +11896,11 @@ ignore@^7.0.5: resolved "https://registry.yarnpkg.com/ignore/-/ignore-7.0.5.tgz#4cb5f6cd7d4c7ab0365738c7aea888baa6d7efd9" integrity sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg== +image-meta@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/image-meta/-/image-meta-0.1.1.tgz#a84dc7d5f61c7d60e85ec0c3ac81beee8646039b" + integrity sha512-+oXiHwOEPr1IE5zY0tcBLED/CYcre15J4nwL50x3o0jxWqEkyjrusiKP3YSU+tr9fvJp33ZcP5Gpj2295g3aEw== + image-meta@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/image-meta/-/image-meta-0.2.1.tgz#3a9eb9f0bfd2f767ca2b0720623c2e03742aa29f" @@ -11802,6 +11964,11 @@ index-to-position@^1.1.0: resolved "https://registry.yarnpkg.com/index-to-position/-/index-to-position-1.1.0.tgz#2e50bd54c8040bdd6d9b3d95ec2a8fedf86b4d44" integrity sha512-XPdx9Dq4t9Qk1mTMbWONJqU7boCoumEH7fRET37HX5+khDUl3J2W6PdALxhILYlIYx2amlwYcRPp28p0tSiojg== +inflation@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/inflation/-/inflation-2.1.0.tgz#9214db11a47e6f756d111c4f9df96971c60f886c" + integrity sha512-t54PPJHG1Pp7VQvxyVCJ9mBbjG3Hqryges9bXoOO6GExCPa+//i/d5GSuFtpx3ALLd7lgIAur6zrIlBQyJuMlQ== + inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -11810,11 +11977,16 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: +inherits@2, inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3, inherits@~2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== + ini@4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/ini/-/ini-4.1.1.tgz#d95b3d843b1e906e56d6747d5447904ff50ce7a1" @@ -11912,6 +12084,21 @@ invariant@^2.0.0, invariant@^2.2.2, invariant@^2.2.3, invariant@^2.2.4: dependencies: loose-envify "^1.0.0" +ioredis@^5.3.2: + version "5.10.1" + resolved "https://registry.yarnpkg.com/ioredis/-/ioredis-5.10.1.tgz#6082781d8aec8d51ee4936bf81d0610404db1e3d" + integrity sha512-HuEDBTI70aYdx1v6U97SbNx9F1+svQKBDo30o0b9fw055LMepzpOOd0Ccg9Q6tbqmBSJaMuY0fB7yw9/vjBYCA== + dependencies: + "@ioredis/commands" "1.5.1" + cluster-key-slot "^1.1.0" + debug "^4.3.4" + denque "^2.1.0" + lodash.defaults "^4.2.0" + lodash.isarguments "^3.1.0" + redis-errors "^1.2.0" + redis-parser "^3.0.0" + standard-as-callback "^2.1.0" + ipaddr.js@1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" @@ -11939,6 +12126,24 @@ ipx@2.1.0: unstorage "^1.10.1" xss "^1.0.14" +ipx@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/ipx/-/ipx-1.3.2.tgz#316752e839020f5fde092eb5424cf3f766bd8c89" + integrity sha512-C2lNT6S5AdPw9OT8gbqIKBwPW4KgGzUK4qKlYmG4UsVU/QtPvqvimd/EWx8flop3WpprTExGLaMsFxG46aHv9w== + dependencies: + "@fastify/accept-negotiator" "^1.1.0" + consola "^3.2.3" + defu "^6.1.2" + destr "^2.0.1" + etag "^1.8.1" + image-meta "^0.1.1" + listhen "^1.5.5" + node-fetch-native "^1.4.0" + pathe "^1.1.1" + sharp "^0.32.6" + ufo "^1.3.1" + xss "^1.0.14" + iron-webcrypto@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/iron-webcrypto/-/iron-webcrypto-1.2.1.tgz#aa60ff2aa10550630f4c0b11fd2442becdb35a6f" @@ -12315,6 +12520,11 @@ is-promise@^2.2.2: resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1" integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ== +is-promise@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-4.0.0.tgz#42ff9f84206c1991d26debf520dd5c01042dd2f3" + integrity sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ== + is-regex@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.2.1.tgz#76d70a3ed10ef9be48eb577887d74205bf0cad22" @@ -13063,7 +13273,7 @@ linkfs@^2.1.0: resolved "https://registry.yarnpkg.com/linkfs/-/linkfs-2.1.0.tgz#5cc774ad8ed6b0aae5a858bd67e3334cc300a917" integrity sha512-kmsGcmpvjStZ0ATjuHycBujtNnXiZR28BTivEu0gAMDTT7GEyodcK6zSRtu6xsrdorrPZEIN380x7BD7xEYkew== -listhen@^1.5.6: +listhen@^1.2.2, listhen@^1.5.5, listhen@^1.5.6: version "1.9.0" resolved "https://registry.yarnpkg.com/listhen/-/listhen-1.9.0.tgz#59355f7e4fc1eefda6bc494ae7e9ed13aa7658ef" integrity sha512-I8oW2+QL5KJo8zXNWX046M134WchxsXC7SawLPvRQpogCbkyQIaFxPE89A2HiwR7vAK2Dm2ERBAmyjTYGYEpBg== @@ -13288,6 +13498,11 @@ lodash.includes@^4.3.0: resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" integrity sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w== +lodash.isarguments@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" + integrity sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg== + lodash.isboolean@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" @@ -13476,7 +13691,7 @@ lru-cache@4.0.0: pseudomap "^1.0.1" yallist "^2.0.0" -lru-cache@^10.0.1, lru-cache@^10.2.0, lru-cache@^10.4.3: +lru-cache@^10.0.0, lru-cache@^10.0.1, lru-cache@^10.2.0, lru-cache@^10.4.3: version "10.4.3" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== @@ -14473,6 +14688,11 @@ mkdirp@^1.0.3: resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== +mkdirp@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-3.0.1.tgz#e44e4c5607fb279c168241713cc6e0fea9adcb50" + integrity sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg== + mlly@^1.7.1, mlly@^1.7.4: version "1.7.4" resolved "https://registry.yarnpkg.com/mlly/-/mlly-1.7.4.tgz#3d7295ea2358ec7a271eaa5d000a0f84febe100f" @@ -14511,6 +14731,11 @@ move-file@^3.0.0: dependencies: path-exists "^5.0.0" +mri@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" + integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== + ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -14555,6 +14780,16 @@ multer@^1.4.5-lts.1: type-is "^1.6.4" xtend "^4.0.0" +multer@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/multer/-/multer-2.1.1.tgz#122d819244fbdfee1efddd9147426691014385b7" + integrity sha512-mo+QTzKlx8R7E5ylSXxWzGoXoZbOsRMpyitcht8By2KHvMbf3tjwosZ/Mu/XYU6UuJ3VZnODIrak5ZrPiPyB6A== + dependencies: + append-field "^1.0.0" + busboy "^1.6.0" + concat-stream "^2.0.0" + type-is "^1.6.18" + multiparty@4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/multiparty/-/multiparty-4.2.3.tgz#6b14981badb5ad3f0929622868751810368d4633" @@ -14564,6 +14799,11 @@ multiparty@4.2.3: safe-buffer "5.2.1" uid-safe "2.1.5" +murmurhash@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/murmurhash/-/murmurhash-2.0.1.tgz#4097720e08cf978872194ad84ea5be2dec9b610f" + integrity sha512-5vQEh3y+DG/lMPM0mCGPDnyV8chYg/g7rl6v3Gd8WMF9S429ox3Xk8qrk174kWhG767KQMqqxLD1WnGd77hiew== + mute-stream@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" @@ -14840,6 +15080,11 @@ node-domexception@^1.0.0: resolved "https://registry.yarnpkg.com/node-domexception/-/node-domexception-1.0.0.tgz#6888db46a1f71c0b76b3f7555016b63fe64766e5" integrity sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ== +node-fetch-native@^1.2.0, node-fetch-native@^1.4.0, node-fetch-native@^1.6.7: + version "1.6.7" + resolved "https://registry.yarnpkg.com/node-fetch-native/-/node-fetch-native-1.6.7.tgz#9d09ca63066cc48423211ed4caf5d70075d76a71" + integrity sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q== + node-fetch-native@^1.6.4, node-fetch-native@^1.6.6: version "1.6.6" resolved "https://registry.yarnpkg.com/node-fetch-native/-/node-fetch-native-1.6.6.tgz#ae1d0e537af35c2c0b0de81cbff37eedd410aa37" @@ -14854,7 +15099,7 @@ node-fetch@3.3.2, node-fetch@^3.0.0, node-fetch@^3.1.1, node-fetch@^3.3.1, node- fetch-blob "^3.1.4" formdata-polyfill "^4.0.10" -node-fetch@^2.6.11, node-fetch@^2.6.7, node-fetch@^2.7.0: +node-fetch@^2.0.0, node-fetch@^2.6.1, node-fetch@^2.6.11, node-fetch@^2.6.7, node-fetch@^2.7.0: version "2.7.0" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== @@ -14901,6 +15146,11 @@ node-mock-http@^1.0.0: resolved "https://registry.yarnpkg.com/node-mock-http/-/node-mock-http-1.0.0.tgz#4b32cd509c7f46d844e68ea93fb8be405a18a42a" integrity sha512-0uGYQ1WQL1M5kKvGRXWQ3uZCHtLTO8hln3oBjIusM75WoesZ909uQJs/Hb946i2SS+Gsrhkaa6iAO17jRIv6DQ== +node-mock-http@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/node-mock-http/-/node-mock-http-1.0.4.tgz#21f2ab4ce2fe4fbe8a660d7c5195a1db85e042a4" + integrity sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ== + node-object-hash@^2.3.10: version "2.3.10" resolved "https://registry.yarnpkg.com/node-object-hash/-/node-object-hash-2.3.10.tgz#4b0c1a3a8239e955f0db71f8e00b38b5c0b33992" @@ -15131,6 +15381,15 @@ obug@^2.1.1: resolved "https://registry.yarnpkg.com/obug/-/obug-2.1.1.tgz#2cba74ff241beb77d63055ddf4cd1e9f90b538be" integrity sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ== +ofetch@^1.1.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/ofetch/-/ofetch-1.5.1.tgz#5c43cc56e03398b273014957060344254505c5c7" + integrity sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA== + dependencies: + destr "^2.0.5" + node-fetch-native "^1.6.7" + ufo "^1.6.1" + ofetch@^1.3.3, ofetch@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/ofetch/-/ofetch-1.4.1.tgz#b6bf6b0d75ba616cef6519dd8b6385a8bae480ec" @@ -15813,6 +16072,19 @@ path-type@^5.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-5.0.0.tgz#14b01ed7aea7ddf9c7c3f46181d4d04f9c785bb8" integrity sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg== +path@^0.12.7: + version "0.12.7" + resolved "https://registry.yarnpkg.com/path/-/path-0.12.7.tgz#d4dc2a506c4ce2197eb481ebfcd5b36c0140b10f" + integrity sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q== + dependencies: + process "^0.11.1" + util "^0.10.3" + +pathe@^0.3.0: + version "0.3.9" + resolved "https://registry.yarnpkg.com/pathe/-/pathe-0.3.9.tgz#4baff768f37f03e3d9341502865fb93116f65191" + integrity sha512-6Y6s0vT112P3jD8dGfuS6r+lpa0qqNrLyHPOwvXMnyNTQaYiwgau2DP3aNDsR13xqtGj7rrPo+jFUATpU6/s+g== + pathe@^1.1.1, pathe@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/pathe/-/pathe-1.1.2.tgz#6c4cb47a945692e48a1ddd6e4094d170516437ec" @@ -16369,7 +16641,7 @@ process-warning@^4.0.0: resolved "https://registry.yarnpkg.com/process-warning/-/process-warning-4.0.1.tgz#5c1db66007c67c756e4e09eb170cdece15da32fb" integrity sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q== -process@^0.11.10: +process@^0.11.1, process@^0.11.10: version "0.11.10" resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== @@ -16509,6 +16781,13 @@ qs@^6.12.3, qs@^6.9.6: dependencies: side-channel "^1.1.0" +qs@^6.5.2: + version "6.15.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.15.0.tgz#db8fd5d1b1d2d6b5b33adaf87429805f1909e7b3" + integrity sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ== + dependencies: + side-channel "^1.1.0" + query-string@^6.14.1: version "6.14.1" resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.14.1.tgz#7ac2dca46da7f309449ba0f86b1fd28255b0c86a" @@ -16581,6 +16860,16 @@ raw-body@2.5.2, raw-body@^2.3.0: iconv-lite "0.4.24" unpipe "1.0.0" +raw-body@^2.3.3: + version "2.5.3" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.3.tgz#11c6650ee770a7de1b494f197927de0c923822e2" + integrity sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA== + dependencies: + bytes "~3.1.2" + http-errors "~2.0.1" + iconv-lite "~0.4.24" + unpipe "~1.0.0" + raw-loader@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-4.0.2.tgz#1aac6b7d1ad1501e66efdac1522c73e59a584eb6" @@ -17381,7 +17670,7 @@ read@^1.0.7: dependencies: mute-stream "~0.0.4" -readable-stream@3, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0, readable-stream@^3.6.2: +readable-stream@3, readable-stream@^3.0.2, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0, readable-stream@^3.6.2: version "3.6.2" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== @@ -17452,6 +17741,18 @@ recursive-readdir@^2.2.2: dependencies: minimatch "^3.0.5" +redis-errors@^1.0.0, redis-errors@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/redis-errors/-/redis-errors-1.2.0.tgz#eb62d2adb15e4eaf4610c04afe1529384250abad" + integrity sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w== + +redis-parser@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/redis-parser/-/redis-parser-3.0.0.tgz#b66d828cdcafe6b4b8a428a7def4c6bcac31c8b4" + integrity sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A== + dependencies: + redis-errors "^1.0.0" + redux-devtools-extension@^2.13.8: version "2.13.9" resolved "https://registry.yarnpkg.com/redux-devtools-extension/-/redux-devtools-extension-2.13.9.tgz#6b764e8028b507adcb75a1cae790f71e6be08ae7" @@ -18355,7 +18656,7 @@ setimmediate@^1.0.5: resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== -setprototypeof@1.2.0: +setprototypeof@1.2.0, setprototypeof@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== @@ -18819,6 +19120,11 @@ stackframe@^1.3.4: resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.3.4.tgz#b881a004c8c149a5e8efef37d51b16e412943310" integrity sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw== +standard-as-callback@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/standard-as-callback/-/standard-as-callback-2.1.0.tgz#8953fc05359868a77b5b9739a665c5977bb7df45" + integrity sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A== + state-toggle@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/state-toggle/-/state-toggle-1.0.3.tgz#e123b16a88e143139b09c6852221bc9815917dfe" @@ -18834,6 +19140,11 @@ statuses@2.0.1: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== +statuses@^2.0.1, statuses@~2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.2.tgz#8f75eecef765b5e1cfcdc080da59409ed424e382" + integrity sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw== + std-env@^3.10.0: version "3.10.0" resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.10.0.tgz#d810b27e3a073047b2b5e40034881f5ea6f9c83b" @@ -19629,7 +19940,7 @@ toggle-selection@^1.0.6: resolved "https://registry.yarnpkg.com/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32" integrity sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ== -toidentifier@1.0.1: +toidentifier@1.0.1, toidentifier@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== @@ -19866,7 +20177,7 @@ type-fest@^4.18.2, type-fest@^4.21.0, type-fest@^4.39.1, type-fest@^4.6.0: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.41.0.tgz#6ae1c8e5731273c2bf1f58ad39cbae2c91a46c58" integrity sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA== -type-is@^1.6.4, type-is@~1.6.18: +type-is@^1.6.16, type-is@^1.6.18, type-is@^1.6.4, type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== @@ -19997,6 +20308,11 @@ ua-parser-js@^1.0.35: resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-1.0.40.tgz#ac6aff4fd8ea3e794a6aa743ec9c2fc29e75b675" integrity sha512-z6PJ8Lml+v3ichVojCiB8toQJBuwR42ySM4ezjXIqXK3M0HczmKQ3LF4rhU55PfD99KEEXQG6yb7iOMyvYuHew== +ufo@^1.0.0, ufo@^1.2.0, ufo@^1.3.1, ufo@^1.6.3: + version "1.6.3" + resolved "https://registry.yarnpkg.com/ufo/-/ufo-1.6.3.tgz#799666e4e88c122a9659805e30b9dc071c3aed4f" + integrity sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q== + ufo@^1.3.2, ufo@^1.5.4, ufo@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/ufo/-/ufo-1.6.1.tgz#ac2db1d54614d1b22c1d603e3aef44a85d8f146b" @@ -20354,6 +20670,23 @@ unpipe@1.0.0, unpipe@~1.0.0: resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== +unstorage@1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/unstorage/-/unstorage-1.9.0.tgz#0c1977f4e769a48344339ac97ec3f2feea94d43d" + integrity sha512-VpD8ZEYc/le8DZCrny3bnqKE4ZjioQxBRnWE+j5sGNvziPjeDlaS1NaFFHzl/kkXaO3r7UaF8MGQrs14+1B4pQ== + dependencies: + anymatch "^3.1.3" + chokidar "^3.5.3" + destr "^2.0.1" + h3 "^1.7.1" + ioredis "^5.3.2" + listhen "^1.2.2" + lru-cache "^10.0.0" + mri "^1.2.0" + node-fetch-native "^1.2.0" + ofetch "^1.1.1" + ufo "^1.2.0" + unstorage@^1.10.1: version "1.16.0" resolved "https://registry.yarnpkg.com/unstorage/-/unstorage-1.16.0.tgz#686e23d459532e0eccc32e15eb3b415d8f309431" @@ -20491,6 +20824,13 @@ util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== +util@^0.10.3: + version "0.10.4" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901" + integrity sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A== + dependencies: + inherits "2.0.3" + utila@~0.4: version "0.4.0" resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c"