diff --git a/apps/webapp/app/components/CopyText.tsx b/apps/webapp/app/components/CopyText.tsx new file mode 100644 index 000000000..5f3ac68aa --- /dev/null +++ b/apps/webapp/app/components/CopyText.tsx @@ -0,0 +1,28 @@ +import React, { useCallback } from "react"; + +export type CopyTextProps = { + children?: React.ReactNode; + value: string; + className?: string; + onCopied?: () => void; +}; + +export function CopyText({ + children, + value, + className, + onCopied, +}: CopyTextProps) { + const onClick = useCallback(() => { + navigator.clipboard.writeText(value); + if (onCopied) { + onCopied(); + } + }, [value, onCopied]); + + return ( +
+ {children} +
+ ); +} diff --git a/apps/webapp/app/components/CopyTextButton.tsx b/apps/webapp/app/components/CopyTextButton.tsx index 7f68bb65b..678c67a69 100644 --- a/apps/webapp/app/components/CopyTextButton.tsx +++ b/apps/webapp/app/components/CopyTextButton.tsx @@ -1,7 +1,7 @@ import { ClipboardIcon } from "@heroicons/react/24/outline"; import classNames from "classnames"; import { useCallback, useState } from "react"; -import { CopyText } from "../libraries/ui/src/components/CopyText"; +import { CopyText } from "./CopyText"; const variantStyle = { slate: diff --git a/apps/webapp/app/components/GitHubLoginButton.tsx b/apps/webapp/app/components/GitHubLoginButton.tsx new file mode 100644 index 000000000..d0f4c8986 --- /dev/null +++ b/apps/webapp/app/components/GitHubLoginButton.tsx @@ -0,0 +1,53 @@ +import classNames from "classnames"; + +type GitHubLoginButtonProps = { + label?: string; + className?: string; + onClick?: () => void; +}; + +export function GitHubLoginButton({ + label = "Login with GitHub", + className, + onClick, +}: GitHubLoginButtonProps) { + return ( + + ); +} + +export function OctoKitty({ className }: { className?: string }) { + return ( + + + + ); +} diff --git a/apps/webapp/app/components/LoginPromoPanel.tsx b/apps/webapp/app/components/LoginPromoPanel.tsx new file mode 100644 index 000000000..61aa86a3a --- /dev/null +++ b/apps/webapp/app/components/LoginPromoPanel.tsx @@ -0,0 +1,83 @@ +import { + EyeIcon, + BoltIcon, + BanknotesIcon, + BugAntIcon, + BellAlertIcon, +} from "@heroicons/react/24/outline"; + +export function LoginPromoPanel() { + return ( +
+ +
+ ); +} diff --git a/apps/webapp/app/components/code/JSONEditor.tsx b/apps/webapp/app/components/code/JSONEditor.tsx index eddc19e2c..30517d372 100644 --- a/apps/webapp/app/components/code/JSONEditor.tsx +++ b/apps/webapp/app/components/code/JSONEditor.tsx @@ -5,7 +5,7 @@ import type { UseCodeMirror, } from "@uiw/react-codemirror"; import { useCodeMirror } from "@uiw/react-codemirror"; -import clsx from "clsx"; +import classNames from "classnames"; import { useRef, useEffect } from "react"; import { getEditorSetup } from "./codeMirrorSetup"; import { lightTheme } from "./codeMirrorTheme"; @@ -77,7 +77,7 @@ export function JSONEditor(opts: JSONEditorProps) { return (
{ if (!onBlur) return; diff --git a/apps/webapp/app/components/code/JavascriptEditor.tsx b/apps/webapp/app/components/code/JavascriptEditor.tsx index e71e2c8ff..4061e470f 100644 --- a/apps/webapp/app/components/code/JavascriptEditor.tsx +++ b/apps/webapp/app/components/code/JavascriptEditor.tsx @@ -5,7 +5,7 @@ import type { UseCodeMirror, } from "@uiw/react-codemirror"; import { useCodeMirror } from "@uiw/react-codemirror"; -import clsx from "clsx"; +import classNames from "classnames"; import { useRef, useEffect } from "react"; import { getEditorSetup } from "./codeMirrorSetup"; import { darkTheme } from "./codeMirrorTheme"; @@ -68,7 +68,7 @@ export function CodeEditor(opts: CodeEditorProps) { return (
{ if (!onBlur) return; diff --git a/apps/webapp/app/components/primitives/Input.tsx b/apps/webapp/app/components/primitives/Input.tsx index 48a056fa9..16337516e 100644 --- a/apps/webapp/app/components/primitives/Input.tsx +++ b/apps/webapp/app/components/primitives/Input.tsx @@ -1,4 +1,4 @@ -import clsx from "clsx"; +import classNames from "classnames"; const roundedStyles = { roundedLeft: @@ -21,7 +21,7 @@ export function Input({ roundedEdges = "roundedFull", ...props }: InputProps) { - const classes = clsx(roundedStyles[roundedEdges], className); + const classes = classNames(roundedStyles[roundedEdges], className); return ( ; diff --git a/apps/webapp/app/routes/login.magic.tsx b/apps/webapp/app/routes/login.magic.tsx new file mode 100644 index 000000000..e3e8fc423 --- /dev/null +++ b/apps/webapp/app/routes/login.magic.tsx @@ -0,0 +1,174 @@ +import type { ActionArgs, LoaderArgs, MetaFunction } from "@remix-run/node"; +import { redirect } from "@remix-run/node"; +import { Form, Link, useLoaderData, useTransition } from "@remix-run/react"; +import { + commitSession, + getUserSession, +} from "~/services/sessionStorage.server"; +import { authenticator } from "~/services/auth.server"; +import { ArrowLeftIcon } from "@heroicons/react/24/solid"; +import { InboxArrowDownIcon } from "@heroicons/react/24/outline"; +import { z } from "zod"; +import { LoginPromoPanel } from "~/components/LoginPromoPanel"; +import { Logo } from "~/components/Logo"; + +export async function loader({ request }: LoaderArgs) { + await authenticator.isAuthenticated(request, { + successRedirect: "/", + }); + + const session = await getUserSession(request); + + return { magicLinkSent: session.has("apihero:magiclink") }; +} + +export async function action({ request }: ActionArgs) { + const clonedRequest = request.clone(); + + const payload = Object.fromEntries(await clonedRequest.formData()); + + const { action } = z + .object({ + action: z.enum(["send", "reset"]), + }) + .parse(payload); + + if (action === "send") { + await authenticator.authenticate("email-link", request, { + successRedirect: "/login/magic", + failureRedirect: "/login/magic", + }); + } else { + const session = await getUserSession(request); + session.unset("apihero:magiclink"); + + return redirect("/login/magic", { + headers: { + "Set-Cookie": await commitSession(session), + }, + }); + } +} + +export const meta: MetaFunction = () => { + return { + title: "Login", + }; +}; + +export default function LoginMagicLinkPage() { + const { magicLinkSent } = useLoaderData(); + const transition = useTransition(); + + return ( +
+ +
+
+
+
+ + + + {magicLinkSent ? ( + <> + +

We've sent you a magic link!

+

+ We sent you an email which contains a magic link that will + log you in to your account. +

+
+ + + + Log in using another option + +
+ + ) : ( + <> +

+ Welcome to Trigger.dev +

+

+ Enter your email address to get started. +

+
+ + + {transition.state === "submitting" && + transition.type === "actionSubmission" && + transition.submission.formData.get("action") === "send" ? ( + + ) : ( + + )} + + + + All login options + +
+ + )} +
+
+
+

+ By logging in with your email you agree to our{" "} + + terms + {" "} + and{" "} + + privacy + {" "} + policies. +

+
+
+
+
+ ); +} diff --git a/apps/webapp/app/routes/login.tsx b/apps/webapp/app/routes/login.tsx new file mode 100644 index 000000000..b6f863650 --- /dev/null +++ b/apps/webapp/app/routes/login.tsx @@ -0,0 +1,103 @@ +import { EnvelopeIcon } from "@heroicons/react/24/solid"; +import type { LoaderFunction, MetaFunction } from "@remix-run/node"; +import { json, redirect } from "@remix-run/node"; +import { Form, Link, useLoaderData } from "@remix-run/react"; +import { GitHubLoginButton } from "~/components/GitHubLoginButton"; +import { LoginPromoPanel } from "~/components/LoginPromoPanel"; +import { Logo } from "~/components/Logo"; +import { commitSession, setRedirectTo } from "~/services/redirectTo.server"; +import { getUserId } from "~/services/session.server"; + +type LoaderData = { + redirectTo?: string; +}; + +export const loader: LoaderFunction = async ({ request }) => { + const userId = await getUserId(request); + if (userId) return redirect("/"); + + const url = new URL(request.url); + const redirectTo = url.searchParams.get("redirectTo"); + + if (redirectTo) { + const session = await setRedirectTo(request, redirectTo); + + return json( + { redirectTo }, + { + headers: { + "Set-Cookie": await commitSession(session), + }, + } + ); + } else { + return json({}); + } +}; + +export const meta: MetaFunction = () => { + return { + title: "Login", + }; +}; + +export default function LoginPage() { + const data = useLoaderData(); + return ( +
+ +
+
+
+
+ + + +

+ Welcome to Trigger.dev +

+

+ Connect your GitHub account to get started. +

+ +
+
+ { + + + Continue with email + + } +
+

+ By connecting your GitHub account you agree to our{" "} + + terms + {" "} + and{" "} + + privacy + {" "} + policies. +

+
+
+
+
+ ); +} diff --git a/apps/webapp/app/routes/logout.tsx b/apps/webapp/app/routes/logout.tsx new file mode 100644 index 000000000..25e42ac1c --- /dev/null +++ b/apps/webapp/app/routes/logout.tsx @@ -0,0 +1,10 @@ +import type { ActionFunction, LoaderFunction } from "@remix-run/node"; +import { authenticator } from "~/services/auth.server"; + +export const action: ActionFunction = async ({ request }) => { + return await authenticator.logout(request, { redirectTo: "/" }); +}; + +export const loader: LoaderFunction = async ({ request }) => { + return await authenticator.logout(request, { redirectTo: "/" }); +}; diff --git a/apps/webapp/app/routes/magic.tsx b/apps/webapp/app/routes/magic.tsx new file mode 100644 index 000000000..6a65b5cc9 --- /dev/null +++ b/apps/webapp/app/routes/magic.tsx @@ -0,0 +1,12 @@ +import type { LoaderArgs } from "@remix-run/server-runtime"; +import { authenticator } from "~/services/auth.server"; +import { getRedirectTo } from "~/services/redirectTo.server"; + +export async function loader({ request }: LoaderArgs) { + const redirectTo = await getRedirectTo(request); + + await authenticator.authenticate("email-link", request, { + successRedirect: redirectTo ?? "/", + failureRedirect: "/login", + }); +} diff --git a/apps/webapp/app/services/email.server.ts b/apps/webapp/app/services/email.server.ts index 35dc7a215..f063c804b 100644 --- a/apps/webapp/app/services/email.server.ts +++ b/apps/webapp/app/services/email.server.ts @@ -1,7 +1,7 @@ import type { User } from "~/models/user.server"; import mailgun from "mailgun-js"; import { env } from "~/env.server"; -import { mergent } from "~/mergent.server"; +import { mergent } from "./mergent.server"; const mailgunDomain = "apihero.run"; @@ -16,7 +16,7 @@ export async function sendEmail( body: string ) { const data = { - from: `API Hero <${env.SENDGRID_FROM_EMAIL}>`, + from: `API Hero <${env.FROM_EMAIL}>`, to: emailAddress, subject, html: body, @@ -27,7 +27,7 @@ export async function sendEmail( export async function sendWelcomeEmail(user: User) { const data = { - from: `API Hero <${env.SENDGRID_FROM_EMAIL}>`, + from: `API Hero <${env.FROM_EMAIL}>`, to: user.email, subject: "🤝 Welcome to API Hero!", template: "welcome_email_test1", diff --git a/apps/webapp/app/services/mergent.server.ts b/apps/webapp/app/services/mergent.server.ts new file mode 100644 index 000000000..e312f1dd9 --- /dev/null +++ b/apps/webapp/app/services/mergent.server.ts @@ -0,0 +1,4 @@ +import Mergent from "mergent"; +import { env } from "~/env.server"; + +export const mergent = new Mergent(env.MERGENT_KEY); diff --git a/apps/webapp/package.json b/apps/webapp/package.json index 8c937c74a..5e7884470 100644 --- a/apps/webapp/package.json +++ b/apps/webapp/package.json @@ -53,12 +53,15 @@ "@remix-run/react": "^1.7.2", "@remix-run/server-runtime": "^1.7.0", "@sentry/remix": "^7.19.0", + "@types/mailgun-js": "^0.22.12", "@uiw/react-codemirror": "^4.13.2", "classnames": "^2.3.1", "compression": "^1.7.4", "cross-env": "^7.0.3", "cuid": "^2.1.8", "express": "^4.18.1", + "mailgun-js": "^0.22.0", + "mergent": "^1.4.0", "morgan": "^1.10.0", "nanoid": "^3.3.4", "postcss-import": "^14.1.0", @@ -80,6 +83,7 @@ }, "devDependencies": { "@apihero/tailwind-config": "*", + "@faker-js/faker": "^7.6.0", "@remix-run/dev": "^1.7.2", "@remix-run/eslint-config": "^1.7.2", "@swc/core": "^1.3.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3f6686e91..4b59c9c01 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -37,6 +37,7 @@ importers: '@codemirror/search': ^6.2.3 '@codemirror/state': ^6.1.3 '@codemirror/view': ^6.5.0 + '@faker-js/faker': ^7.6.0 '@headlessui/react': ^1.6.4 '@heroicons/react': ^2.0.12 '@lezer/highlight': ^1.1.2 @@ -59,6 +60,7 @@ importers: '@types/eslint': ^8.4.6 '@types/express': ^4.17.13 '@types/jest': ^29.2.0 + '@types/mailgun-js': ^0.22.12 '@types/morgan': ^1.9.3 '@types/node': ^18.8.0 '@types/react': ^18.0.21 @@ -82,6 +84,8 @@ importers: express: ^4.18.1 glob: ^8.0.3 happy-dom: ^6.0.4 + mailgun-js: ^0.22.0 + mergent: ^1.4.0 morgan: ^1.10.0 msw: ^0.47.0 nanoid: ^3.3.4 @@ -134,12 +138,15 @@ importers: '@remix-run/react': 1.8.1_biqbaboplfbrettd7655fr4n2y '@remix-run/server-runtime': 1.8.1_biqbaboplfbrettd7655fr4n2y '@sentry/remix': 7.23.0_dfehptsum4bkg2mncqmjuvk644 + '@types/mailgun-js': 0.22.12 '@uiw/react-codemirror': 4.17.1_c746qxthrd2ism2rvn4crnq5om classnames: 2.3.2 compression: 1.7.4 cross-env: 7.0.3 cuid: 2.1.8 express: 4.18.2 + mailgun-js: 0.22.0 + mergent: 1.4.0 morgan: 1.10.0 nanoid: 3.3.4 postcss-import: 14.1.0_postcss@8.4.19 @@ -160,6 +167,7 @@ importers: zod: 3.19.1 devDependencies: '@apihero/tailwind-config': link:../../config-packages/tailwind-config + '@faker-js/faker': 7.6.0 '@remix-run/dev': 1.8.1_biqbaboplfbrettd7655fr4n2y '@remix-run/eslint-config': 1.8.1_3d7osmpeeoyqkoluqnkoj2u33y '@swc/core': 1.3.21 @@ -1834,6 +1842,11 @@ packages: - supports-color dev: true + /@faker-js/faker/7.6.0: + resolution: {integrity: sha512-XK6BTq1NDMo9Xqw/YkYyGjSsg44fbNwYRx7QK2CuoQgyy+f1rrTDHoExVM5PsyXCtfl2vs2vVJ0MN0yN6LppRw==} + engines: {node: '>=14.0.0', npm: '>=6.0.0'} + dev: true + /@gar/promisify/1.1.3: resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} dev: true @@ -2953,6 +2966,13 @@ packages: '@types/node': 18.11.11 dev: true + /@types/mailgun-js/0.22.12: + resolution: {integrity: sha512-fTjuh2mOPoJF2BN0QAhE5iPOBls333KIJrmrrJHObMDuBCgEfaENLX2LH1FjKqhfuWfGotKOfPFZMuSok5Ow7g==} + dependencies: + '@types/node': 18.11.11 + form-data: 2.5.1 + dev: false + /@types/mdast/3.0.10: resolution: {integrity: sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==} dependencies: @@ -2995,7 +3015,6 @@ packages: /@types/node/18.11.11: resolution: {integrity: sha512-KJ021B1nlQUBLopzZmPBVuGU9un7WJd/W4ya7Ih02B4Uwky5Nja0yGYav2EfYIk0RR2Q9oVhf60S2XR1BCWJ2g==} - dev: true /@types/node/8.10.66: resolution: {integrity: sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==} @@ -3384,6 +3403,20 @@ packages: hasBin: true dev: true + /agent-base/4.2.1: + resolution: {integrity: sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==} + engines: {node: '>= 4.0.0'} + dependencies: + es6-promisify: 5.0.0 + dev: false + + /agent-base/4.3.0: + resolution: {integrity: sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==} + engines: {node: '>= 4.0.0'} + dependencies: + es6-promisify: 5.0.0 + dev: false + /agent-base/6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} @@ -3628,7 +3661,6 @@ packages: engines: {node: '>=4'} dependencies: tslib: 2.4.1 - dev: true /ast-types/0.15.2: resolution: {integrity: sha512-c27loCv9QkZinsa5ProX751khO9DJl/AcB5c2KNtA6NRvHKS0PgLfcftz72KVq504vB0Gku5s2kUZzDBvQWvHg==} @@ -3647,13 +3679,18 @@ packages: hasBin: true dev: true + /async/2.6.4: + resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==} + dependencies: + lodash: 4.17.21 + dev: false + /async/3.2.4: resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==} dev: true /asynckit/0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - dev: true /at-least-node/1.0.0: resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} @@ -4243,6 +4280,11 @@ packages: engines: {node: '>=0.8'} dev: true + /co/4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + dev: false + /code-point-at/1.1.0: resolution: {integrity: sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==} engines: {node: '>=0.10.0'} @@ -4303,7 +4345,6 @@ packages: engines: {node: '>= 0.8'} dependencies: delayed-stream: 1.0.0 - dev: true /comma-separated-tokens/2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} @@ -4550,6 +4591,10 @@ packages: assert-plus: 1.0.0 dev: true + /data-uri-to-buffer/1.2.0: + resolution: {integrity: sha512-vKQ9DTQPN1FLYiiEEOQ6IBGFqvjCa5rSK3cWMy/Nespm5d/x3dGFT9UBZnkLxCwua/IXBi2TYnwTEpsOvhC4UQ==} + dev: false + /data-uri-to-buffer/3.0.1: resolution: {integrity: sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==} engines: {node: '>= 6'} @@ -4578,6 +4623,17 @@ packages: dependencies: ms: 2.0.0 + /debug/3.1.0: + resolution: {integrity: sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.0.0 + dev: false + /debug/3.2.7: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: @@ -4587,7 +4643,6 @@ packages: optional: true dependencies: ms: 2.1.3 - dev: true /debug/3.2.7_supports-color@5.5.0: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} @@ -4708,7 +4763,6 @@ packages: /deep-is/0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - dev: true /defaults/1.0.4: resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} @@ -4764,6 +4818,14 @@ packages: resolution: {integrity: sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==} dev: true + /degenerator/1.0.4: + resolution: {integrity: sha512-EMAC+riLSC64jKfOs1jp8J7M4ZXstUUwTdwFBEv6HOzL/Ae+eAzMKEK0nJnpof2fnw9IOjmE6u6qXFejVyk8AA==} + dependencies: + ast-types: 0.14.2 + escodegen: 1.14.3 + esprima: 3.1.3 + dev: false + /degenerator/3.0.2: resolution: {integrity: sha512-c0mef3SNQo56t6urUU6tdQAs+ThoD0o9B9MJ8HEt7NQcGEILCRFqQb7ZbP9JAv+QF1Ky5plydhMR/IrqWDm+TQ==} engines: {node: '>= 6'} @@ -4777,7 +4839,6 @@ packages: /delayed-stream/1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} - dev: true /delegates/1.0.0: resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} @@ -5001,6 +5062,16 @@ packages: is-symbol: 1.0.4 dev: true + /es6-promise/4.2.8: + resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} + dev: false + + /es6-promisify/5.0.0: + resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} + dependencies: + es6-promise: 4.2.8 + dev: false + /esbuild-android-64/0.15.12: resolution: {integrity: sha512-MJKXwvPY9g0rGps0+U65HlTsM1wUs9lbjt5CU19RESqycGFDRijMDQsh68MtbzkqWSRdEtiKS1mtPzKneaAI0Q==} engines: {node: '>=12'} @@ -5433,7 +5504,6 @@ packages: optionator: 0.8.3 optionalDependencies: source-map: 0.6.1 - dev: true /eslint-config-next/12.3.4_s5ps7njkmjlaqajutnox5ntcla: resolution: {integrity: sha512-WuT3gvgi7Bwz00AOmKGhOeqnyA5P29Cdyr0iVjLyfDbk+FANQKcOjFUTZIdyYfe5Tq1x4TGcmoe4CwctGvFjHQ==} @@ -5915,11 +5985,16 @@ packages: eslint-visitor-keys: 3.3.0 dev: true + /esprima/3.1.3: + resolution: {integrity: sha512-AWwVMNxwhN8+NIPQzAQZCm7RkLC4RbM3B1OobMuyp3i+w73X57KCKaVIxaRZb+DYCojq7rspo+fmuQfAboyhFg==} + engines: {node: '>=4'} + hasBin: true + dev: false + /esprima/4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true - dev: true /esquery/1.4.0: resolution: {integrity: sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==} @@ -5938,7 +6013,6 @@ packages: /estraverse/4.3.0: resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} engines: {node: '>=4.0'} - dev: true /estraverse/5.3.0: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} @@ -5996,7 +6070,6 @@ packages: /esutils/2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} - dev: true /etag/1.8.1: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} @@ -6151,7 +6224,6 @@ packages: /extend/3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - dev: true /external-editor/3.1.0: resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} @@ -6229,7 +6301,6 @@ packages: /fast-levenshtein/2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - dev: true /fastq/1.14.0: resolution: {integrity: sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg==} @@ -6269,8 +6340,6 @@ packages: /file-uri-to-path/1.0.0: resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} - dev: true - optional: true /file-uri-to-path/2.0.0: resolution: {integrity: sha512-hjPFI8oE/2iQPVe4gbrJ73Pp+Xfub2+WI2LlXDbsaJBwT5wuMh35WNWVYYTpnz895shtwfyutMFLFywpQAFdLg==} @@ -6407,7 +6476,6 @@ packages: asynckit: 0.4.0 combined-stream: 1.0.8 mime-types: 2.1.35 - dev: true /format/0.2.2: resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} @@ -6493,7 +6561,6 @@ packages: dependencies: readable-stream: 1.1.14 xregexp: 2.0.0 - dev: true /function-bind/1.1.1: resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} @@ -6599,6 +6666,19 @@ packages: /get-tsconfig/4.2.0: resolution: {integrity: sha512-X8u8fREiYOE6S8hLbq99PeykTDoLVnxvF4DjWKJmz9xy2nNRdUcV8ZN9tniJFeKyTU3qnC9lL8n4Chd6LmVKHg==} + /get-uri/2.0.4: + resolution: {integrity: sha512-v7LT/s8kVjs+Tx0ykk1I+H/rbpzkHvuIq87LmeXptcf5sNWm9uQiwjNAt94SJPA1zOlCntmnOlJvVWKmzsxG8Q==} + dependencies: + data-uri-to-buffer: 1.2.0 + debug: 2.6.9 + extend: 3.0.2 + file-uri-to-path: 1.0.0 + ftp: 0.3.10 + readable-stream: 2.3.7 + transitivePeerDependencies: + - supports-color + dev: false + /get-uri/3.0.2: resolution: {integrity: sha512-+5s0SJbGoyiJTZZ2JTpFPLMPSch72KEqGOTvQsBqg0RBWvwhWUSYZFAtz3TPW0GXJuLBJPts1E241iHg+VRfhg==} engines: {node: '>= 6'} @@ -7001,6 +7081,16 @@ packages: statuses: 2.0.1 toidentifier: 1.0.1 + /http-proxy-agent/2.1.0: + resolution: {integrity: sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==} + engines: {node: '>= 4.5.0'} + dependencies: + agent-base: 4.3.0 + debug: 3.1.0 + transitivePeerDependencies: + - supports-color + dev: false + /http-proxy-agent/4.0.1: resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} engines: {node: '>= 6'} @@ -7035,6 +7125,16 @@ packages: resolve-alpn: 1.2.1 dev: true + /https-proxy-agent/3.0.1: + resolution: {integrity: sha512-+ML2Rbh6DAuee7d07tYGEKOEi2voWPUGan+ExdPbPW6Z3svq+JCqr0v8WmKPOkz1vOVykPCBSuobe7G8GJUtVg==} + engines: {node: '>= 4.5.0'} + dependencies: + agent-base: 4.3.0 + debug: 3.2.7 + transitivePeerDependencies: + - supports-color + dev: false + /https-proxy-agent/5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} @@ -7106,6 +7206,16 @@ packages: resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==} dev: true + /inflection/1.12.0: + resolution: {integrity: sha512-lRy4DxuIFWXlJU7ed8UiTJOSTqStqYdEb4CEbtXfNbkdj3nH1L+reUWiE10VWcJS2yR7tge8Z74pJjtBjNwj0w==} + engines: {'0': node >= 0.4.0} + dev: false + + /inflection/1.3.8: + resolution: {integrity: sha512-xRvG6XhAkbneGO5BXP0uKyGkzmZ2bBbrFkx4ZVNx2TmsECbiq/pJapbbx/NECh+E85IfZwW5+IeVNJfkQgavag==} + engines: {'0': node >= 0.4.0} + dev: false + /inflight/1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} dependencies: @@ -7169,9 +7279,12 @@ packages: engines: {node: '>=8'} dev: false + /ip/1.1.5: + resolution: {integrity: sha512-rBtCAQAJm8A110nbwn6YdveUnuZH3WrC36IwkRXxDnq53JvXA2NVQvB7IHyKomxK1MJ4VDNw3UtFDdXQ+AvLYA==} + dev: false + /ip/1.1.8: resolution: {integrity: sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==} - dev: true /ip/2.0.0: resolution: {integrity: sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==} @@ -7469,6 +7582,11 @@ packages: call-bind: 1.0.2 dev: true + /is-stream/1.1.0: + resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} + engines: {node: '>=0.10.0'} + dev: false + /is-stream/2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} @@ -7538,7 +7656,6 @@ packages: /isarray/0.0.1: resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} - dev: true /isarray/1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} @@ -7867,7 +7984,6 @@ packages: dependencies: prelude-ls: 1.1.2 type-check: 0.3.2 - dev: true /levn/0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} @@ -7986,7 +8102,6 @@ packages: /lodash/4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - dev: true /log-symbols/4.1.0: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} @@ -8043,7 +8158,6 @@ packages: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} dependencies: yallist: 3.1.1 - dev: true /lru-cache/6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} @@ -8074,6 +8188,24 @@ packages: sourcemap-codec: 1.4.8 dev: true + /mailgun-js/0.22.0: + resolution: {integrity: sha512-a2alg5nuTZA9Psa1pSEIEsbxr1Zrmqx4VkgGCQ30xVh0kIH7Bu57AYILo+0v8QLSdXtCyLaS+KVmdCrQo0uWFA==} + engines: {node: '>=6.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + dependencies: + async: 2.6.4 + debug: 4.3.4 + form-data: 2.5.1 + inflection: 1.12.0 + is-stream: 1.1.0 + path-proxy: 1.0.0 + promisify-call: 2.0.4 + proxy-agent: 3.1.1 + tsscmp: 1.0.6 + transitivePeerDependencies: + - supports-color + dev: false + /make-dir/2.1.0: resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} engines: {node: '>=6'} @@ -8249,6 +8381,14 @@ packages: engines: {node: '>= 8'} dev: true + /mergent/1.4.0: + resolution: {integrity: sha512-OTkCBu/28brBtxSW6VaMxdmImH37CrclmLfZhSC64qinCLyDgZ56TiUeelMGefvWf+2ZojK2506vFPFrraYGsA==} + dependencies: + node-fetch: 2.6.7 + transitivePeerDependencies: + - encoding + dev: false + /methods/1.1.2: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} @@ -8787,6 +8927,11 @@ packages: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} dev: true + /netmask/1.0.6: + resolution: {integrity: sha512-3DWDqAtIiPSkBXZyYEjwebfK56nrlQfRGt642fu8RPaL+ePu750+HCMHxjJCG3iEHq/0aeMvX6KIzlv7nuhfrA==} + engines: {node: '>= 0.4.0'} + dev: false + /netmask/2.0.2: resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} engines: {node: '>= 0.4.0'} @@ -9065,7 +9210,6 @@ packages: prelude-ls: 1.1.2 type-check: 0.3.2 word-wrap: 1.2.3 - dev: true /optionator/0.9.1: resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} @@ -9164,6 +9308,21 @@ packages: engines: {node: '>=6'} dev: true + /pac-proxy-agent/3.0.1: + resolution: {integrity: sha512-44DUg21G/liUZ48dJpUSjZnFfZro/0K5JTyFYLBcmh9+T6Ooi4/i4efwUiEy0+4oQusCBqWdhv16XohIj1GqnQ==} + dependencies: + agent-base: 4.3.0 + debug: 4.3.4 + get-uri: 2.0.4 + http-proxy-agent: 2.1.0 + https-proxy-agent: 3.0.1 + pac-resolver: 3.0.0 + raw-body: 2.5.1 + socks-proxy-agent: 4.0.2 + transitivePeerDependencies: + - supports-color + dev: false + /pac-proxy-agent/5.0.0: resolution: {integrity: sha512-CcFG3ZtnxO8McDigozwE3AqAw15zDvGH+OjXO4kzf7IkEKkQ4gxQ+3sdF50WmhQ4P/bVusXcqNE2S3XrNURwzQ==} engines: {node: '>= 8'} @@ -9181,6 +9340,16 @@ packages: - supports-color dev: true + /pac-resolver/3.0.0: + resolution: {integrity: sha512-tcc38bsjuE3XZ5+4vP96OfhOugrX+JcnpUbhfuc4LuXBLQhoTthOstZeoQJBDnQUDYzYmdImKsbz0xSl1/9qeA==} + dependencies: + co: 4.6.0 + degenerator: 1.0.4 + ip: 1.1.8 + netmask: 1.0.6 + thunkify: 2.1.2 + dev: false + /pac-resolver/5.0.1: resolution: {integrity: sha512-cy7u00ko2KVgBAjuhevqpPeHIkCIqPe1v24cydhWjmeuzaBfmUWFCZJ1iAh5TuVzVZoUzXIW7K8sMYOZ84uZ9Q==} engines: {node: '>= 8'} @@ -9283,6 +9452,12 @@ packages: /path-parse/1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + /path-proxy/1.0.0: + resolution: {integrity: sha512-p9IuY9FRY1nU59RDW+tnLL6qMxmBnY03WGYxzy1FcqE5OMO5ggz7ahmOBH0JBS+9f95Yc7V5TZ+kHpTeFWaLQA==} + dependencies: + inflection: 1.3.8 + dev: false + /path-to-regexp/0.1.7: resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} @@ -9484,7 +9659,6 @@ packages: /prelude-ls/1.1.2: resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} engines: {node: '>= 0.8.0'} - dev: true /prelude-ls/1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} @@ -9583,6 +9757,13 @@ packages: asap: 2.0.6 dev: true + /promisify-call/2.0.4: + resolution: {integrity: sha512-ZX68J1+1Pe0I8NC0P6Ji3fDDcJceVfpoygfDLgdb1fp5vW9IRlwSpDaxe1T5HgwchyHV2DsL/pWzWikUiWEbLQ==} + engines: {node: '>=4.0'} + dependencies: + with-callback: 1.0.2 + dev: false + /prop-types/15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} dependencies: @@ -9602,6 +9783,22 @@ packages: forwarded: 0.2.0 ipaddr.js: 1.9.1 + /proxy-agent/3.1.1: + resolution: {integrity: sha512-WudaR0eTsDx33O3EJE16PjBRZWcX8GqCEeERw1W3hZJgH/F2a46g7jty6UGty6NeJ4CKQy8ds2CJPMiyeqaTvw==} + engines: {node: '>=6'} + dependencies: + agent-base: 4.3.0 + debug: 4.3.4 + http-proxy-agent: 2.1.0 + https-proxy-agent: 3.0.1 + lru-cache: 5.1.1 + pac-proxy-agent: 3.0.1 + proxy-from-env: 1.1.0 + socks-proxy-agent: 4.0.2 + transitivePeerDependencies: + - supports-color + dev: false + /proxy-agent/5.0.0: resolution: {integrity: sha512-gkH7BkvLVkSfX9Dk27W6TyNOWWZWRilRfk1XxGNWOYJ2TuedAv1yFpCaU9QSBmBe716XOTNpYNOzhysyw8xn7g==} engines: {node: '>= 8'} @@ -9821,7 +10018,6 @@ packages: inherits: 2.0.4 isarray: 0.0.1 string_decoder: 0.10.31 - dev: true /readable-stream/2.3.7: resolution: {integrity: sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==} @@ -10448,7 +10644,6 @@ packages: /smart-buffer/4.2.0: resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} - dev: true /snapdragon-node/2.1.1: resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==} @@ -10482,6 +10677,14 @@ packages: - supports-color dev: true + /socks-proxy-agent/4.0.2: + resolution: {integrity: sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg==} + engines: {node: '>= 6'} + dependencies: + agent-base: 4.2.1 + socks: 2.3.3 + dev: false + /socks-proxy-agent/5.0.1: resolution: {integrity: sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ==} engines: {node: '>= 6'} @@ -10493,6 +10696,14 @@ packages: - supports-color dev: true + /socks/2.3.3: + resolution: {integrity: sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + dependencies: + ip: 1.1.5 + smart-buffer: 4.2.0 + dev: false + /socks/2.7.1: resolution: {integrity: sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==} engines: {node: '>= 10.13.0', npm: '>= 3.0.0'} @@ -10747,7 +10958,6 @@ packages: /string_decoder/0.10.31: resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} - dev: true /string_decoder/1.1.1: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} @@ -11053,6 +11263,10 @@ packages: xtend: 4.0.2 dev: true + /thunkify/2.1.2: + resolution: {integrity: sha512-w9foI80XcGImrhMQ19pxunaEC5Rp2uzxZZg4XBAFRfiLOplk3F0l7wo+bO16vC2/nlQfR/mXZxcduo0MF2GWLg==} + dev: false + /tiny-glob/0.2.9: resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==} dependencies: @@ -11223,7 +11437,11 @@ packages: /tslib/2.4.1: resolution: {integrity: sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==} - dev: true + + /tsscmp/1.0.6: + resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==} + engines: {node: '>=0.6.x'} + dev: false /tsutils/3.21.0_typescript@4.9.3: resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} @@ -11321,7 +11539,6 @@ packages: engines: {node: '>= 0.8.0'} dependencies: prelude-ls: 1.1.2 - dev: true /type-check/0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} @@ -11855,10 +12072,14 @@ packages: string-width: 4.2.3 dev: false + /with-callback/1.0.2: + resolution: {integrity: sha512-zaUhn7OWgikdqWlPYpZ4rTX/6IAV0czMVyd+C6QLVrif2tATF28CYUnHBmHs2a5EaZo7bB1+plBUPHto+HW8uA==} + engines: {node: '>=4'} + dev: false + /word-wrap/1.2.3: resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} engines: {node: '>=0.10.0'} - dev: true /wrap-ansi/6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} @@ -11934,7 +12155,6 @@ packages: /xregexp/2.0.0: resolution: {integrity: sha512-xl/50/Cf32VsGq/1R8jJE5ajH1yMCQkpmoS10QbFZWl2Oor4H0Me64Pu2yxvsRWK3m6soJbmGfzSR7BYmDcWAA==} - dev: true /xtend/4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} @@ -11951,7 +12171,6 @@ packages: /yallist/3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - dev: true /yallist/4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}